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
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 #ifndef WINSTL_INCL_H_WINSTL
00064 # include "winstl.h"
00065 #endif
00066 #ifndef WINSTL_INCL_H_WINSTL_PROCESSHEAP_ALLOCATOR
00067 # include "winstl_processheap_allocator.h"
00068 #endif
00069 #ifndef STLSOFT_INCL_H_STLSOFT_CHAR_TRAITS
00070 # include "stlsoft_char_traits.h"
00071 #endif
00072 #ifndef WINSTL_INCL_H_WINSTL_STRING_ACCESS
00073 # include "winstl_string_access.h"
00074 #endif
00075
00076
00077
00078
00079
00080 #ifndef _WINSTL_NO_NAMESPACE
00081 # if defined(_STLSOFT_NO_NAMESPACE) || \
00082 defined(__STLSOFT_DOCUMENTATION_SKIP_SECTION)
00083
00084 namespace winstl
00085 {
00086 # else
00087
00088
00089 namespace stlsoft
00090 {
00091
00092 namespace winstl_project
00093 {
00094
00095 # endif
00096 #endif
00097
00098
00099
00102
00106
00111
00112
00113
00114
00115
00117 template< ss_typename_param_k C
00118 #ifdef __STLSOFT_CF_TEMPLATE_CLASS_DEFAULT_CLASS_ARGUMENT_SUPPORT
00119 , ss_typename_param_k T = char_traits<C>
00120 , ss_typename_param_k A = processheap_allocator<C>
00121 #else
00122 , ss_typename_param_k T
00123 , ss_typename_param_k A
00124 #endif
00125 >
00126 class basic_environment_block
00127 {
00130 public:
00132 typedef C value_type;
00134 typedef C char_type;
00136 typedef T traits_type;
00138 typedef A allocator_type;
00140 typedef basic_environment_block<C, T, A> class_type;
00142 typedef ws_size_t size_type;
00144
00147 public:
00148 basic_environment_block()
00149 : m_buffer(2)
00150 {
00151 m_buffer[0] = '\0';
00152 m_buffer[1] = '\0';
00153 }
00154 basic_environment_block(class_type const &rhs)
00155 : m_buffer(rhs.m_buffer.size())
00156 {
00157 pod_copy_n(&m_buffer.data()[0], &rhs.m_buffer.data()[0], m_buffer.size());
00158 }
00159
00160 class_type &operator =(class_type const &rhs)
00161 {
00162 if(m_buffer.resize(rhs.m_buffer.size()))
00163 {
00164 pod_copy_n(&m_buffer.data()[0], &rhs.m_buffer.data()[0], m_buffer.size());
00165 }
00166
00167 return *this;
00168 }
00170
00173 public:
00175 void push_back(char_type const *s, size_t cch)
00176 {
00177 stlsoft_assert(NULL != s);
00178 stlsoft_assert(cch >= 3);
00179 stlsoft_assert(NULL != traits_type::find(s, cch, '='));
00180
00181 size_type oldSize = m_buffer.size();
00182
00183 stlsoft_assert(m_buffer.size() > 1);
00184 stlsoft_assert('\0' == m_buffer[m_buffer.size() - 1]);
00185 stlsoft_assert('\0' == m_buffer[m_buffer.size() - 2]);
00186
00187 m_buffer.resize(oldSize + cch + 1);
00188
00189 traits_type::copy(&m_buffer[oldSize - 1], s, cch);
00190 m_buffer[m_buffer.size() - 2] = '\0';
00191 m_buffer[m_buffer.size() - 1] = '\0';
00192
00193 stlsoft_assert(m_buffer.size() > 1);
00194 stlsoft_assert('\0' == m_buffer[m_buffer.size() - 1]);
00195 stlsoft_assert('\0' == m_buffer[m_buffer.size() - 2]);
00196 }
00197 template <typename S>
00198 void push_back(S const &s)
00199 {
00200 push_back(stlsoft_ns_qual(c_str_ptr)(s), stlsoft_ns_qual(c_str_len)(s));
00201 }
00202 void push_back(char_type const *name, size_t cchName, char_type const *value, size_t cchValue)
00203 {
00204 stlsoft_assert(NULL != name);
00205 stlsoft_assert(NULL != value);
00206 stlsoft_assert(cchName > 1);
00207 stlsoft_assert(cchValue > 1);
00208
00209 size_type oldSize = m_buffer.size();
00210
00211 stlsoft_assert(m_buffer.size() > 1);
00212 stlsoft_assert('\0' == m_buffer[m_buffer.size() - 1]);
00213 stlsoft_assert('\0' == m_buffer[m_buffer.size() - 2]);
00214
00215 m_buffer.resize(oldSize + cchName + 1 + cchValue + 1);
00216
00217 traits_type::copy(&m_buffer[oldSize - 2], name, cchName);
00218 m_buffer[oldSize - 2 + cchName] = '=';
00219 traits_type::copy(&m_buffer[oldSize - 2 + cchName + 1], value, cchValue);
00220 m_buffer[oldSize - 2 + cchName + 1 + cchValue] = '\0';
00221 m_buffer[m_buffer.size() - 2] = '\0';
00222 m_buffer[m_buffer.size() - 1] = '\0';
00223
00224 stlsoft_assert(m_buffer.size() > 1);
00225 stlsoft_assert('\0' == m_buffer[m_buffer.size() - 1]);
00226 stlsoft_assert('\0' == m_buffer[m_buffer.size() - 2]);
00227 }
00228 template <typename S1, typename S2>
00229 void push_back(S1 const &name, S2 const &value)
00230 {
00231 push_back(stlsoft_ns_qual(c_str_ptr)(name), stlsoft_ns_qual(c_str_len)(name), stlsoft_ns_qual(c_str_ptr)(value), stlsoft_ns_qual(c_str_len)(value));
00232 }
00233
00234 void clear()
00235 {
00236 m_buffer.resize(2);
00237
00238 m_buffer[0] = '\0';
00239 m_buffer[1] = '\0';
00240 }
00242
00245 public:
00246 void const *base() const
00247 {
00248 return m_buffer.data();
00249 }
00250 size_type length() const
00251 {
00252 return m_buffer.size();
00253 }
00255
00257 private:
00258 typedef stlsoft_ns_qual(auto_buffer)<char_type, allocator_type, 1024> buffer_type;
00259
00260 buffer_type m_buffer;
00261 };
00262
00263
00264
00265
00266
00267 #ifdef __STLSOFT_CF_TEMPLATE_CLASS_DEFAULT_CLASS_ARGUMENT_SUPPORT
00268
00270 typedef basic_environment_block<ws_char_a_t> environment_block_a;
00272 typedef basic_environment_block<ws_char_w_t> environment_block_w;
00274 typedef basic_environment_block<TCHAR> environment_block;
00275
00276 #endif
00277
00278
00279
00280
00281
00282 #ifdef STLSOFT_UNITTEST
00283
00284 namespace unittest
00285 {
00286 ss_bool_t test_winstl_environment_block(unittest_reporter *r)
00287 {
00288 using stlsoft::unittest::unittest_initialiser;
00289
00290 ss_bool_t bSuccess = true;
00291
00292 unittest_initialiser init(r, "WinSTL", "environment_block", __FILE__);
00293
00294 return bSuccess;
00295 }
00296
00297 unittest_registrar unittest_winstl_environment_block(test_winstl_environment_block);
00298
00299 }
00300
00301 #endif
00302
00303
00304
00305
00306
00307
00308
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321 #endif
00322
00323
00324
00325
00326
00327