Wim van der Vegt / TINYXML

Dependents:   tinyxml_test

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers tinystr.cpp Source File

tinystr.cpp

00001 /*
00002 www.sourceforge.net/projects/tinyxml
00003 Original file by Yves Berquin.
00004 
00005 This software is provided 'as-is', without any express or implied
00006 warranty. In no event will the authors be held liable for any
00007 damages arising from the use of this software.
00008 
00009 Permission is granted to anyone to use this software for any
00010 purpose, including commercial applications, and to alter it and
00011 redistribute it freely, subject to the following restrictions:
00012 
00013 1. The origin of this software must not be misrepresented; you must
00014 not claim that you wrote the original software. If you use this
00015 software in a product, an acknowledgment in the product documentation
00016 would be appreciated but is not required.
00017 
00018 2. Altered source versions must be plainly marked as such, and
00019 must not be misrepresented as being the original software.
00020 
00021 3. This notice may not be removed or altered from any source
00022 distribution.
00023 */
00024 
00025 /*
00026  * THIS FILE WAS ALTERED BY Tyge L�, 7. April 2005.
00027  */
00028 
00029 
00030 #ifndef TIXML_USE_STL
00031 
00032 #include "tinystr.h"
00033 
00034 // Error value for find primitive
00035 const TiXmlString::size_type TiXmlString::npos = static_cast< TiXmlString::size_type >(-1);
00036 
00037 
00038 // Null rep.
00039 TiXmlString::Rep TiXmlString::nullrep_ = { 0, 0, { '\0' } };
00040 
00041 
00042 void TiXmlString::reserve (size_type cap)
00043 {
00044     if (cap > capacity())
00045     {
00046         TiXmlString tmp;
00047         tmp.init(length(), cap);
00048         memcpy(tmp.start(), data(), length());
00049         swap(tmp);
00050     }
00051 }
00052 
00053 
00054 TiXmlString& TiXmlString::assign(const char* str, size_type len)
00055 {
00056     size_type cap = capacity();
00057     if (len > cap || cap > 3*(len + 8))
00058     {
00059         TiXmlString tmp;
00060         tmp.init(len);
00061         memcpy(tmp.start(), str, len);
00062         swap(tmp);
00063     }
00064     else
00065     {
00066         memmove(start(), str, len);
00067         set_size(len);
00068     }
00069     return *this;
00070 }
00071 
00072 
00073 TiXmlString& TiXmlString::append(const char* str, size_type len)
00074 {
00075     size_type newsize = length() + len;
00076     if (newsize > capacity())
00077     {
00078         reserve (newsize + capacity());
00079     }
00080     memmove(finish(), str, len);
00081     set_size(newsize);
00082     return *this;
00083 }
00084 
00085 
00086 TiXmlString operator + (const TiXmlString & a, const TiXmlString & b)
00087 {
00088     TiXmlString tmp;
00089     tmp.reserve(a.length() + b.length());
00090     tmp += a;
00091     tmp += b;
00092     return tmp;
00093 }
00094 
00095 TiXmlString operator + (const TiXmlString & a, const char* b)
00096 {
00097     TiXmlString tmp;
00098     TiXmlString::size_type b_len = static_cast<TiXmlString::size_type>( strlen(b) );
00099     tmp.reserve(a.length() + b_len);
00100     tmp += a;
00101     tmp.append(b, b_len);
00102     return tmp;
00103 }
00104 
00105 TiXmlString operator + (const char* a, const TiXmlString & b)
00106 {
00107     TiXmlString tmp;
00108     TiXmlString::size_type a_len = static_cast<TiXmlString::size_type>( strlen(a) );
00109     tmp.reserve(a_len + b.length());
00110     tmp.append(a, a_len);
00111     tmp += b;
00112     return tmp;
00113 }
00114 
00115 
00116 #endif    // TIXML_USE_STL