summaryrefslogtreecommitdiff
path: root/src/strings/rstring.tcc
diff options
context:
space:
mode:
authorBen Longbons <b.r.longbons@gmail.com>2014-08-11 22:52:18 -0700
committerBen Longbons <b.r.longbons@gmail.com>2014-08-25 17:58:12 -0700
commitadd7ff74ca25ca2c9cc591abc484f8e6d38b2c39 (patch)
treec62ef1510966effdf81bec6710125b75783ff512 /src/strings/rstring.tcc
parent54df2e07fc4cc0bd8557e4152be15353ecf53d0d (diff)
downloadtmwa-add7ff74ca25ca2c9cc591abc484f8e6d38b2c39.tar.gz
tmwa-add7ff74ca25ca2c9cc591abc484f8e6d38b2c39.tar.bz2
tmwa-add7ff74ca25ca2c9cc591abc484f8e6d38b2c39.tar.xz
tmwa-add7ff74ca25ca2c9cc591abc484f8e6d38b2c39.zip
Optimize string literals in refcounted strings
Diffstat (limited to 'src/strings/rstring.tcc')
-rw-r--r--src/strings/rstring.tcc25
1 files changed, 10 insertions, 15 deletions
diff --git a/src/strings/rstring.tcc b/src/strings/rstring.tcc
index c247b8f..8a85b1d 100644
--- a/src/strings/rstring.tcc
+++ b/src/strings/rstring.tcc
@@ -1,6 +1,6 @@
// strings/rstring.tcc - Inline functions for rstring.hpp
//
-// Copyright © 2013 Ben Longbons <b.r.longbons@gmail.com>
+// Copyright © 2013-2014 Ben Longbons <b.r.longbons@gmail.com>
//
// This file is part of The Mana World (Athena server)
//
@@ -25,12 +25,11 @@ namespace tmwa
namespace strings
{
template<class It>
- void RString::_assign(It b, It e)
+ RString::RString(It b, It e)
+ : RString()
{
- owned = nullptr;
if (b == e)
{
- *this = RString();
return;
}
if (!std::is_base_of<std::forward_iterator_tag, typename std::iterator_traits<It>::iterator_category>::value)
@@ -43,23 +42,19 @@ namespace strings
return;
}
size_t diff = std::distance(b, e);
- owned = static_cast<Rep *>(::operator new(sizeof(Rep) + diff + 1));
- owned->count = 0;
- owned->size = diff;
- std::copy(b, e, owned->body);
- owned->body[diff] = '\0';
- }
+ u.owned = static_cast<Rep *>(::operator new(sizeof(Rep) + diff + 1));
+ maybe_end = nullptr;
- template<class It>
- RString::RString(It b, It e)
- {
- _assign(b, e);
+ u.owned->count = 0;
+ u.owned->size = diff;
+ std::copy(b, e, u.owned->body);
+ u.owned->body[diff] = '\0';
}
template<uint8_t n>
RString::RString(const VString<n>& v)
+ : RString(v.begin(), v.end())
{
- _assign(v.begin(), v.end());
}
} // namespace strings
} // namespace tmwa