3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
8 * Full author contact details are available in file CREDITS.
13 #include "support/trivstring.h"
14 #include "support/docstring.h"
16 #ifdef STD_STRING_USES_COW
24 template trivial_string<char>::trivial_string(trivial_string const &);
25 template trivial_string<char_type>::trivial_string(trivial_string const &);
26 template<typename Char>
27 trivial_string<Char>::trivial_string(trivial_string const & that) : size_(that.size_)
30 copy(that.data_sso(), that.data_sso() + size_ + 1, data_sso());
32 data_ = new Char[size_ + 1];
33 copy(that.data_, that.data_ + size_ + 1, data_);
35 // else Happens only for really big Char types
39 template trivial_string<char>::trivial_string(string const &);
40 template trivial_string<char_type>::trivial_string(docstring const &);
41 template<typename Char>
42 trivial_string<Char>::trivial_string(
43 basic_string<Char, char_traits<Char>, allocator<Char> > const & that)
44 : size_(that.length())
47 copy(that.begin(), that.end(), data_sso());
48 data_sso()[size_] = '\0';
49 } else if (size_ > 0) {
50 data_ = new Char[size_ + 1];
51 copy(that.begin(), that.end(), data_);
54 // else Happens only for really big Char types
58 template trivial_string<char> &
59 trivial_string<char>::operator=(trivial_string const &);
60 template trivial_string<char_type> &
61 trivial_string<char_type>::operator=(trivial_string const &);
62 template<typename Char>
63 trivial_string<Char> & trivial_string<Char>::operator=(trivial_string const & that)
71 copy(that.data_sso(), that.data_sso() + size_ + 1, data_sso());
73 data_ = new Char[size_ + 1];
74 copy(that.data_, that.data_ + size_ + 1, data_);
76 // Happens only for really big Char types
83 template trivial_string<char> &
84 trivial_string<char>::operator=(string const &);
85 template trivial_string<char_type> &
86 trivial_string<char_type>::operator=(docstring const &);
87 template<typename Char>
88 trivial_string<Char> &
89 trivial_string<Char>::operator=(basic_string<Char, char_traits<Char>, allocator<Char> > const & that)
95 copy(that.begin(), that.end(), data_sso());
96 data_sso()[size_] = '\0';
97 } else if (size_ > 0) {
98 data_ = new Char[size_ + 1];
99 copy(that.begin(), that.end(), data_);
101 // Happens only for really big Char types
109 trivial_string<char>::swap(trivial_string<char> &);
111 trivial_string<char_type>::swap(trivial_string<char_type> &);
112 template<typename Char>
113 void trivial_string<Char>::swap(trivial_string & that)
115 size_t const sizetmp = that.size_;
118 Char * const datatmp = that.data_;
124 template<typename Char>
125 int trivial_string<Char>::compare(trivial_string const & other) const
127 size_t const lsize = this->length();
128 size_t const rsize = other.length();
129 size_t const len = min(lsize, rsize);
130 int r = char_traits<Char>::compare(c_str(), other.c_str(), len);
134 else if (lsize < rsize)
141 template trivial_string<char>::operator string() const;
142 template trivial_string<char_type>::operator docstring() const;
143 template<typename Char>
144 trivial_string<Char>::operator basic_string<Char, char_traits<Char>, allocator<Char> >() const
147 return basic_string<Char, char_traits<Char>, allocator<Char> >(
150 return basic_string<Char, char_traits<Char>, allocator<Char> >(
152 // Happens only for really big Char types
153 return basic_string<Char, char_traits<Char>, allocator<Char> >();
157 template char const * trivial_string<char>::c_str() const;
158 template char_type const * trivial_string<char_type>::c_str() const;
159 template<typename Char> Char const * trivial_string<Char>::c_str() const
165 // Happens only for really big Char types
166 static const Char empty_char = '\0';
171 template bool operator<(trivial_string<char> const &,
172 trivial_string<char> const &);
173 template bool operator<(trivial_string<char_type> const &,
174 trivial_string<char_type> const &);
175 template <typename Char>
176 bool operator<(trivial_string<Char> const & lhs, trivial_string<Char> const & rhs)
178 return lhs.compare(rhs) < 0;
182 template bool operator==(trivial_string<char> const &,
183 trivial_string<char> const &);
184 template bool operator==(trivial_string<char_type> const &,
185 trivial_string<char_type> const &);
186 template <typename Char>
187 bool operator==(trivial_string<Char> const & lhs, trivial_string<Char> const & rhs)
189 return lhs.compare(rhs) == 0;
193 template bool operator==(trivial_string<char> const &, char const *);
194 template bool operator==(trivial_string<char_type> const &, char_type const *);
195 template <typename Char>
196 bool operator==(trivial_string<Char> const & lhs, Char const * rhs)
198 return lhs.compare(trivial_string<Char>(rhs)) == 0;
202 template bool operator==(char const *, trivial_string<char> const &);
203 template bool operator==(char_type const *, trivial_string<char_type> const &);
204 template <typename Char>
205 bool operator==(Char const * lhs, trivial_string<Char> const & rhs)
207 return rhs.compare(trivial_string<Char>(lhs)) == 0;
211 template ostream & operator<<(ostream &, trivial_string<char> const &);
212 template odocstream & operator<<(odocstream &, trivial_string<char_type> const &);
213 template <typename Char>
214 basic_ostream<Char, char_traits<Char> > &
215 operator<<(basic_ostream<Char, char_traits<Char> > & os, trivial_string<Char> const & s)
217 return os << basic_string<Char, char_traits<Char>, allocator<Char> >(s);