diff options
author | Bardur Arantsson <bardur@scientician.net> | 2016-09-17 09:58:15 +0200 |
---|---|---|
committer | Bardur Arantsson <bardur@scientician.net> | 2016-09-17 09:58:15 +0200 |
commit | 446e8bb30e8171988781722fff69b49e2b2d2e20 (patch) | |
tree | 4a52cf4f5f62d0a2607468e91440b99575bead91 | |
parent | c74773d0515b0aab305ec684caf827d5bfc6a172 (diff) |
Split loadsave:do_std_string
-rw-r--r-- | src/loadsave.cc | 52 |
1 files changed, 35 insertions, 17 deletions
diff --git a/src/loadsave.cc b/src/loadsave.cc index b66aeb01..cf257849 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -270,30 +270,48 @@ static void do_string(char *str, int max, ls_flag_t flag) } } -static void do_std_string(std::string &s, ls_flag_t flag) +static void save_std_string(std::string const *s) +{ + // Length prefix. + u32b saved_size = s->size(); + do_u32b(&saved_size, ls_flag_t::SAVE); + // Save each character + for (auto c: *s) + { + sf_put(c); + } +} + +static std::string load_std_string() { // Length prefix. - u32b saved_size = s.size(); - do_u32b(&saved_size, flag); + u32b saved_size; + do_u32b(&saved_size, ls_flag_t::LOAD); // Convert to size_t std::size_t n = saved_size; - // Load/save goes a little differently since we cannot - // assume anything about 's' when loading. - if (flag == ls_flag_t::LOAD) + // Make sure we reserve space rather than resizing as we go. + std::string s; + s.reserve(n); + // Read each character + for (std::size_t i = 0; i < n; i++) { - s.clear(); - s.reserve(n); - for (std::size_t i = 0; i < n; i++) - { - s += sf_get(); - } + s += sf_get(); } - else + // Done + return s; +} + + +static void do_std_string(std::string &s, ls_flag_t flag) +{ + switch (flag) { - for (std::size_t i = 0; i < n; i++) - { - sf_put(s[i]); - } + case ls_flag_t::LOAD: + s = load_std_string(); + break; + case ls_flag_t::SAVE: + save_std_string(&s); + break; } } |