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_CONTAINERS_HPP_ENVIRONMENT_BLOCK
00049 #define STLSOFT_INCL_STLSOFT_CONTAINERS_HPP_ENVIRONMENT_BLOCK
00050 
00051 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00052 # define STLSOFT_VER_STLSOFT_CONTAINERS_HPP_ENVIRONMENT_BLOCK_MAJOR    4
00053 # define STLSOFT_VER_STLSOFT_CONTAINERS_HPP_ENVIRONMENT_BLOCK_MINOR    2
00054 # define STLSOFT_VER_STLSOFT_CONTAINERS_HPP_ENVIRONMENT_BLOCK_REVISION 3
00055 # define STLSOFT_VER_STLSOFT_CONTAINERS_HPP_ENVIRONMENT_BLOCK_EDIT     43
00056 #endif 
00057 
00058 
00059 
00060 
00061 
00062 
00063 
00064 
00065 
00066 #ifndef STLSOFT_INCL_STLSOFT_H_STLSOFT
00067 # include <stlsoft/stlsoft.h>
00068 #endif 
00069 #ifndef STLSOFT_INCL_STLSOFT_MEMORY_HPP_AUTO_BUFFER
00070 # include <stlsoft/memory/auto_buffer.hpp>
00071 #endif 
00072 #ifndef STLSOFT_INCL_STLSOFT_MEMORY_HPP_ALLOCATOR_BASE
00073 # include <stlsoft/memory/allocator_base.hpp>       
00074 #endif 
00075 #ifndef STLSOFT_INCL_STLSOFT_MEMORY_HPP_ALLOCATOR_SELECTOR
00076 # include <stlsoft/memory/allocator_selector.hpp>
00077 #endif 
00078 #ifndef STLSOFT_INCL_STLSOFT_STRING_HPP_CHAR_TRAITS
00079 # include <stlsoft/string/char_traits.hpp>
00080 #endif 
00081 #ifndef STLSOFT_INCL_STLSOFT_SHIMS_ACCESS_HPP_STRING
00082 # include <stlsoft/shims/access/string.hpp>
00083 #endif 
00084 
00085 
00086 
00087 
00088 
00089 #ifndef _STLSOFT_NO_NAMESPACE
00090 namespace stlsoft
00091 {
00092 #endif 
00093 
00094 
00095 
00096 
00097 
00107 template<   ss_typename_param_k C
00108 #ifdef STLSOFT_CF_TEMPLATE_CLASS_DEFAULT_CLASS_ARGUMENT_SUPPORT
00109         ,   ss_typename_param_k T = char_traits<C>
00110         ,   ss_typename_param_k A = ss_typename_type_def_k allocator_selector<C>::allocator_type
00111 #else 
00112         ,   ss_typename_param_k T 
00113         ,   ss_typename_param_k A 
00114 #endif 
00115         >
00116 class basic_environment_block
00117 {
00120 public:
00122     typedef C                                   value_type;
00124     typedef C                                   char_type;
00126     typedef T                                   traits_type;
00128     typedef A                                   allocator_type;
00130     typedef basic_environment_block<C, T, A>    class_type;
00132     typedef char_type*                          pointer;
00134     typedef char_type const*                    const_pointer;
00136     typedef ss_size_t                           size_type;
00138 
00141 public:
00142     basic_environment_block()
00143         : m_chars(1)
00144         , m_offsets(1)
00145         , m_pointers(0)
00146     {
00147         m_chars[0]      =   '\0';
00148         m_offsets[0]    =   0;
00149     }
00151 
00154 public:
00156     void push_back(char_type const* s, ss_size_t cch)
00157     {
00158         STLSOFT_ASSERT(NULL != s);
00159         STLSOFT_ASSERT(cch >= 3);
00160         STLSOFT_ASSERT(NULL != traits_type::find(s, cch, '='));
00161 
00162         STLSOFT_ASSERT(m_chars.size() > 0);
00163         STLSOFT_ASSERT('\0' == m_chars[m_chars.size() - 1]);
00164 
00165         const size_type   numChars_     =   m_chars.size();
00166         const size_type   numOffsets_   =   m_offsets.size();
00167         const size_type   numPointers_  =   m_pointers.size();
00168 
00169         m_chars.resize(numChars_ + cch + 1);
00170         
00171         traits_type::copy(&m_chars[numChars_ - 1], s, cch);
00172         m_chars[numChars_ + cch - 1] = '\0';
00173         
00174         m_chars[numChars_ + cch] = '\0';
00175 
00176         m_offsets.resize(numOffsets_ + 1);
00177         m_offsets[numOffsets_] = numChars_ + cch;
00178 
00179         m_pointers.resize(0);
00180 
00181         STLSOFT_ASSERT('\0' == m_chars[m_chars.size() - 1]);
00182     }
00183     template <ss_typename_param_k S>
00184     void push_back(S const& s)
00185     {
00186         push_back(stlsoft_ns_qual(c_str_data)(s), stlsoft_ns_qual(c_str_len)(s));
00187     }
00188     void push_back(char_type const* name, ss_size_t cchName, char_type const* value, ss_size_t cchValue)
00189     {
00190         STLSOFT_ASSERT(NULL != name);
00191         STLSOFT_ASSERT(NULL != value);
00192         STLSOFT_ASSERT(cchName > 0);
00193         STLSOFT_ASSERT(cchValue > 0);
00194         STLSOFT_ASSERT(NULL == traits_type::find(name, cchName, '='));
00195 
00196         STLSOFT_ASSERT(m_chars.size() > 0);
00197         STLSOFT_ASSERT('\0' == m_chars[m_chars.size() - 1]);
00198 
00199         const size_type   numChars_     =   m_chars.size();
00200         const size_type   numOffsets_       =   m_offsets.size();
00201         const size_type   numPointers_  =   m_pointers.size();
00202 
00203         m_chars.resize(numChars_ + cchName + 1 + cchValue + 1);
00204         
00205 
00206         traits_type::copy(&m_chars[numChars_ - 1], name, cchName);
00207         m_chars[numChars_ - 1 + cchName] = '=';
00208         traits_type::copy(&m_chars[numChars_ - 1 + cchName + 1], value, cchValue);
00209         m_chars[numChars_ - 1 + cchName + 1 + cchValue] = '\0';
00210         
00211         m_chars[numChars_ + cchName + 1 + cchValue] = '\0';
00212 
00213         m_offsets.resize(numOffsets_ + 1);
00214         m_offsets[numOffsets_] = numChars_ + cchName + 1 + cchValue;
00215 
00216         m_pointers.resize(0);
00217 
00218         STLSOFT_ASSERT('\0' == m_chars[m_chars.size() - 1]);
00219     }
00220     template<   ss_typename_param_k S1
00221             ,   ss_typename_param_k S2
00222             >
00223     void push_back(S1 const& name, S2 const& value)
00224     {
00225         push_back(stlsoft_ns_qual(c_str_data)(name), stlsoft_ns_qual(c_str_len)(name), stlsoft_ns_qual(c_str_data)(value), stlsoft_ns_qual(c_str_len)(value));
00226     }
00227 
00228     void clear()
00229     {
00230         m_chars.resize(1);
00231         m_offsets.resize(1);
00232         m_pointers.resize(0);
00233 
00234         m_chars[0]      =   '\0';
00235         m_offsets[0]    =   0;
00236     }
00238 
00241 public:
00242     char_type const* const* base() const
00243     {
00244         if(m_pointers.size() != m_offsets.size())
00245         {
00246             set_pointers();
00247         }
00248 
00249         return m_pointers.data();
00250     }
00251     size_type size() const
00252     {
00253         STLSOFT_ASSERT(m_offsets.size() >= 1);
00254 
00255         return m_offsets.size() - 1;
00256     }
00258 
00259 
00260 private:
00261     void set_pointers()
00262     {
00263         if(m_pointers.resize(m_offsets.size()))
00264         {
00265             for(size_type i = 0; i < m_offsets.size(); ++i)
00266             {
00267                 m_pointers[i] = &m_chars[m_offsets[i]];
00268             }
00269         }
00270     }
00271 
00272     void set_pointers() const
00273     {
00274         const_cast<class_type*>(this)->set_pointers();
00275     }
00276 
00277 
00278 private:
00279     typedef stlsoft_ns_qual(auto_buffer_old)<   char_type
00280                                             ,   allocator_type
00281                                             ,   1024
00282                                             >               char_buffer_type;
00283 
00284     typedef stlsoft_ns_qual(auto_buffer_old)<   size_type
00285 #if defined(STLSOFT_LF_ALLOCATOR_REBIND_SUPPORT)
00286                                             ,   ss_typename_type_k allocator_type::ss_template_qual_k rebind<size_type>::other
00287 #else 
00288                                             ,   ss_typename_type_k allocator_selector<size_type>::allocator_type
00289 #endif 
00290                                             ,   32
00291                                             >               offset_buffer_type;
00292 
00293     typedef stlsoft_ns_qual(auto_buffer_old)<   const_pointer
00294 #if defined(STLSOFT_LF_ALLOCATOR_REBIND_SUPPORT)
00295                                             ,   ss_typename_type_k allocator_type::ss_template_qual_k rebind<pointer>::other
00296 #else 
00297                                             ,   ss_typename_type_k allocator_selector<pointer>::allocator_type
00298 #endif 
00299                                             ,   32
00300                                             >               pointer_buffer_type;
00301 
00302     char_buffer_type        m_chars;
00303     offset_buffer_type      m_offsets;
00304     pointer_buffer_type     m_pointers;
00305 };
00306 
00307 
00308 
00309 
00310 
00311 #ifdef STLSOFT_CF_TEMPLATE_CLASS_DEFAULT_CLASS_ARGUMENT_SUPPORT
00312 
00314 typedef basic_environment_block<ss_char_a_t>    environment_block_a;
00319 typedef basic_environment_block<ss_char_w_t>    environment_block_w;
00320 
00321 #endif 
00322 
00323 
00324 
00325 
00326 
00327 #ifdef STLSOFT_UNITTEST
00328 # include "./unittest/environment_block_unittest_.h"
00329 #endif 
00330 
00331 
00332 
00333 
00334 
00335 
00336 
00337 #ifndef _STLSOFT_NO_NAMESPACE
00338 } 
00339 #endif 
00340 
00341 
00342 
00343 #endif 
00344 
00345