summaryrefslogtreecommitdiff
path: root/src/strings/astring.cpp
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/astring.cpp
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/astring.cpp')
-rw-r--r--src/strings/astring.cpp54
1 files changed, 9 insertions, 45 deletions
diff --git a/src/strings/astring.cpp b/src/strings/astring.cpp
index f1f12c3..e2521df 100644
--- a/src/strings/astring.cpp
+++ b/src/strings/astring.cpp
@@ -47,7 +47,6 @@ namespace strings
std::copy(src + 0, src + 255, dst);
}
- // TODO dedup all this code once I drop gcc 4.6 support
AString::AString()
: data{}, special()
{
@@ -100,78 +99,43 @@ namespace strings
}
AString::AString(const MString& s)
- : data{}, special()
+ : AString(s.begin(), s.end())
{
- if (s.size() > 255 || s.size() == 0)
- {
- new(r_ptr()) RString(s);
- special = 255;
- }
- else
- {
- *std::copy(s.begin(), s.end(), data) = '\0';
- special = 255 - s.size();
- }
}
AString::AString(XPair p)
- : data{}, special()
+ : AString(p.begin(), p.end())
{
- new(r_ptr()) RString();
- special = 255;
- *this = XString(p);
}
AString::AString(const TString& t)
- : data{}, special()
+ : AString(XString(t))
{
- new(r_ptr()) RString();
- special = 255;
- *this = XString(t);
}
AString::AString(const SString& s)
- : data{}, special()
+ : AString(XString(s))
{
- new(r_ptr()) RString();
- special = 255;
- *this = XString(s);
}
AString::AString(ZString z)
- : data{}, special()
+ : AString(XString(z))
{
- new(r_ptr()) RString();
- special = 255;
- *this = XString(z);
}
AString::AString(XString x)
- : data{}, special()
+ : AString()
{
if (const RString *r = x.base())
{
if (&*r->begin() == &*x.begin() && &*r->end() == &*x.end())
{
- new(r_ptr()) RString(*r);
- special = 255;
+ *this = *r;
return;
}
}
- if (x.size() > 255 || x.size() == 0)
- {
- new(r_ptr()) RString(x);
- special = 255;
- }
- else
- {
- *std::copy(x.begin(), x.end(), data) = '\0';
- special = 255 - x.size();
- }
+ *this = AString(x.begin(), x.end());
}
AString::AString(LString l)
- : data{}, special()
+ : AString(RString(l))
{
- new(r_ptr()) RString();
- special = 255;
- *this = XString(l);
}
AString::iterator AString::begin() const