00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00048 #ifndef STLSOFT_INCL_STLSOFT_STRING_HPP_SHIM_STRING
00049 #define STLSOFT_INCL_STLSOFT_STRING_HPP_SHIM_STRING
00050
00051 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00052 # define STLSOFT_VER_STLSOFT_STRING_HPP_SHIM_STRING_MAJOR 3
00053 # define STLSOFT_VER_STLSOFT_STRING_HPP_SHIM_STRING_MINOR 3
00054 # define STLSOFT_VER_STLSOFT_STRING_HPP_SHIM_STRING_REVISION 1
00055 # define STLSOFT_VER_STLSOFT_STRING_HPP_SHIM_STRING_EDIT 44
00056 #endif
00057
00058
00059
00060
00061
00062 #ifndef STLSOFT_INCL_STLSOFT_H_STLSOFT
00063 # include <stlsoft/stlsoft.h>
00064 #endif
00065
00066 #if defined(STLSOFT_COMPILER_IS_MSVC) && \
00067 _MSC_VER < 1200
00068 # include <stlsoft/string/shim_string_vc5_.hpp>
00069 #else
00070
00071 #ifndef STLSOFT_INCL_STLSOFT_STRING_HPP_CHAR_TRAITS
00072 # include <stlsoft/string/char_traits.hpp>
00073 #endif
00074 #ifndef STLSOFT_INCL_STLSOFT_MEMORY_HPP_ALLOCATOR_SELECTOR
00075 # include <stlsoft/memory/allocator_selector.hpp>
00076 #endif
00077 #ifndef STLSOFT_INCL_STLSOFT_HPP_MEMORY_AUTO_BUFFER
00078 # include <stlsoft/memory/auto_buffer.hpp>
00079 #endif
00080 #ifndef STLSOFT_INCL_STLSOFT_META_HPP_YESNO
00081 # include <stlsoft/meta/yesno.hpp>
00082 #endif
00083 #ifndef STLSOFT_INCL_STLSOFT_UTIL_HPP_STD_SWAP
00084 # include <stlsoft/util/std_swap.hpp>
00085 #endif
00086
00087 #if defined(STLSOFT_COMPILER_IS_MSVC) && \
00088 _MSC_VER < 1310
00089 # include <iosfwd>
00090 #endif
00091
00092
00093
00094
00095
00096 #ifndef _STLSOFT_NO_NAMESPACE
00097 namespace stlsoft
00098 {
00099 #endif
00100
00101
00102
00103
00104
00117 template< ss_typename_param_k C
00118 , ss_size_t N = 64
00119 , ss_bool_t U = false
00120 , ss_typename_param_k A = ss_typename_type_def_k allocator_selector<C>::allocator_type
00121 , ss_typename_param_k T = stlsoft_char_traits<C>
00122 >
00123 class basic_shim_string
00124 {
00127 public:
00129 typedef C char_type;
00131 typedef A allocator_type;
00133 typedef T traits_type;
00135 typedef basic_shim_string<C, N, U, A, T> class_type;
00137 typedef ss_size_t size_type;
00139 typedef auto_buffer_old<char_type, allocator_type, N + 1> buffer_type;
00140
00142
00145 public:
00147 ss_explicit_k basic_shim_string(size_type n)
00148 : m_buffer(1 + n)
00149 {
00150 m_buffer[0] = '\0';
00151 m_buffer[m_buffer.size() - 1] = '\0';
00152 }
00153
00155 basic_shim_string(char_type const* s, size_type n)
00156 : m_buffer(1 + n)
00157 {
00158 traits_type::copy(&m_buffer[0], s, m_buffer.size() - 1);
00159 m_buffer[m_buffer.size() - 1] = '\0';
00160 }
00161
00163 basic_shim_string(char_type const* s)
00164 : m_buffer(1 + ((NULL == s) ? 0 : traits_type::length(s)))
00165 {
00166 traits_type::copy(&m_buffer[0], s, m_buffer.size() - 1);
00167 m_buffer[m_buffer.size() - 1] = '\0';
00168 }
00169
00171 basic_shim_string(class_type const& rhs)
00172 : m_buffer(rhs.m_buffer.size())
00173 {
00174 traits_type::copy(&m_buffer[0], &rhs.m_buffer[0], m_buffer.size());
00175 m_buffer[m_buffer.size() - 1] = '\0';
00176 }
00177
00179 void swap(class_type& rhs) stlsoft_throw_0()
00180 {
00181 m_buffer.swap(rhs.get_buffer());
00182 }
00184
00187 public:
00188 void write(char_type const* s)
00189 {
00190 traits_type::copy(&m_buffer[0], s, m_buffer.size());
00191 m_buffer[m_buffer.size() - 1] = '\0';
00192 }
00193
00197 void truncate(ss_size_t n)
00198 {
00199 STLSOFT_MESSAGE_ASSERT("shim_string truncation size must be <= current size", n <= size());
00200
00201 m_buffer.resize(1 + n);
00202 m_buffer[m_buffer.size() - 1] = '\0';
00203 }
00204
00205 buffer_type& get_buffer()
00206 {
00207 return m_buffer;
00208 }
00210
00213 public:
00214 size_type size() const
00215 {
00216 STLSOFT_ASSERT(m_buffer.size() > 0);
00217
00218 return m_buffer.size() - 1;
00219 }
00220 static size_type internal_size()
00221 {
00222 return buffer_type::internal_size();
00223 }
00224
00225 char_type* data()
00226 {
00227 return m_buffer.data();
00228 }
00229
00230 char_type const* data() const
00231 {
00232 return m_buffer.data();
00233 }
00235
00238 operator char_type const* () const
00239 {
00240 typedef ss_typename_type_k value_to_yesno_type<U>::type yesno_t;
00241
00242 return get_ptr_(m_buffer, yesno_t());
00243 }
00244 operator ss_size_t() const
00245 {
00246 return size();
00247 }
00249
00252 private:
00253 static char_type const* get_ptr_(buffer_type const& buffer, yes_type)
00254 {
00255 return ('\0' != buffer[0]) ? buffer.data() : NULL;
00256 }
00257 static char_type const* get_ptr_(buffer_type const& buffer, no_type)
00258 {
00259 return buffer.data();
00260 }
00262
00265 private:
00266 buffer_type m_buffer;
00268
00269
00270 private:
00271 basic_shim_string& operator =(class_type const&);
00272 };
00273
00274
00275
00276
00277
00278 #if !defined(STLSOFT_COMPILER_IS_WATCOM)
00279
00280 template< ss_typename_param_k C
00281 , ss_size_t N
00282 , ss_bool_t U
00283 , ss_typename_param_k A
00284 , ss_typename_param_k T
00285 >
00286 inline C const* c_str_ptr(basic_shim_string<C, N, U, A, T> const& ss)
00287 {
00288 return ss.data();
00289 }
00290
00291 template< ss_typename_param_k C
00292 , ss_size_t N
00293 , ss_bool_t U
00294 , ss_typename_param_k A
00295 , ss_typename_param_k T
00296 >
00297 inline C const* c_str_data(basic_shim_string<C, N, U, A, T> const& ss)
00298 {
00299 return ss.data();
00300 }
00301
00302 template< ss_typename_param_k C
00303 , ss_size_t N
00304 , ss_bool_t U
00305 , ss_typename_param_k A
00306 , ss_typename_param_k T
00307 >
00308 inline ss_size_t c_str_len(basic_shim_string<C, N, U, A, T> const& ss)
00309 {
00310 return ss.size();
00311 }
00312
00313
00314 template< ss_typename_param_k S
00315 , ss_typename_param_k C
00316 , ss_size_t N
00317 , ss_bool_t U
00318 , ss_typename_param_k A
00319 , ss_typename_param_k T
00320 >
00321 inline S& operator <<(S& s, basic_shim_string<C, N, U, A, T> const& ss)
00322 {
00323 s << ss.data();
00324
00325 return s;
00326 }
00327
00328 #endif
00329
00330
00331
00332 #ifndef _STLSOFT_NO_NAMESPACE
00333 }
00334
00335 # if defined(STLSOFT_COMPILER_IS_MSVC) && \
00336 _MSC_VER < 1310
00337
00338 template< ss_typename_param_k C
00339 , stlsoft::ss_size_t N
00340 , stlsoft::ss_bool_t U
00341 , ss_typename_param_k A
00342 , ss_typename_param_k T
00343 >
00344 inline std::basic_ostream<C>& operator <<(std::basic_ostream<C> &s, stlsoft::basic_shim_string<C, N, U, A, T> const& ss)
00345 {
00346 s << ss.data();
00347
00348 return s;
00349 }
00350
00351 # endif
00352
00353 #endif
00354
00355
00356
00357 #endif
00358
00359
00360
00361 #endif
00362
00363