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
00041
00042
00043
00053 #ifndef STLSOFT_INCL_STLSOFT_CONTAINERS_UTIL_HPP_ARRAY_POLICIES
00054 #define STLSOFT_INCL_STLSOFT_CONTAINERS_UTIL_HPP_ARRAY_POLICIES
00055
00056 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00057 # define STLSOFT_VER_STLSOFT_CONTAINERS_UTIL_HPP_ARRAY_POLICIES_MAJOR 5
00058 # define STLSOFT_VER_STLSOFT_CONTAINERS_UTIL_HPP_ARRAY_POLICIES_MINOR 1
00059 # define STLSOFT_VER_STLSOFT_CONTAINERS_UTIL_HPP_ARRAY_POLICIES_REVISION 4
00060 # define STLSOFT_VER_STLSOFT_CONTAINERS_UTIL_HPP_ARRAY_POLICIES_EDIT 136
00061 #endif
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 #ifndef STLSOFT_INCL_STLSOFT_H_STLSOFT
00076 # include <stlsoft/stlsoft.h>
00077 #endif
00078 #ifndef STLSOFT_INCL_STLSOFT_META_HPP_N_TYPES
00079 # include <stlsoft/meta/n_types.hpp>
00080 #endif
00081
00082 #ifndef STLSOFT_INCL_H_STRING
00083 # define STLSOFT_INCL_H_STRING
00084 # include <string.h>
00085 #endif
00086
00087
00088
00089
00090
00091 #ifndef _STLSOFT_NO_NAMESPACE
00092 namespace stlsoft
00093 {
00094 #endif
00095
00096
00097
00098
00099
00100 #ifdef STLSOFT_MULTIDIM_ARRAY_FEATURE_REQUIRES_COPY_CTOR_WITH_RVO
00101 # undef STLSOFT_MULTIDIM_ARRAY_FEATURE_REQUIRES_COPY_CTOR_WITH_RVO
00102 #endif
00103
00104 #if defined(STLSOFT_COMPILER_IS_GCC) && \
00105 __GNUC__ < 4
00106 # define STLSOFT_MULTIDIM_ARRAY_FEATURE_REQUIRES_COPY_CTOR_WITH_RVO
00107 #endif
00108
00109
00110
00111
00112
00155 template <ss_typename_param_k T>
00156 struct do_construction
00157 {
00158 enum
00159 {
00160 value = true
00161 };
00162
00163 typedef one_type type;
00164 };
00165
00166 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00167
00168 STLSOFT_TEMPLATE_SPECIALISATION
00169 struct do_construction<ss_sint8_t> { enum { value = false }; typedef two_type type; };
00170
00171 STLSOFT_TEMPLATE_SPECIALISATION
00172 struct do_construction<ss_uint8_t> { enum { value = false }; typedef two_type type; };
00173
00174 STLSOFT_TEMPLATE_SPECIALISATION
00175 struct do_construction<ss_sint16_t> { enum { value = false }; typedef two_type type; };
00176
00177 STLSOFT_TEMPLATE_SPECIALISATION
00178 struct do_construction<ss_uint16_t> { enum { value = false }; typedef two_type type; };
00179
00180 STLSOFT_TEMPLATE_SPECIALISATION
00181 struct do_construction<ss_sint32_t> { enum { value = false }; typedef two_type type; };
00182
00183 STLSOFT_TEMPLATE_SPECIALISATION
00184 struct do_construction<ss_uint32_t> { enum { value = false }; typedef two_type type; };
00185
00186 #ifdef STLSOFT_CF_64BIT_INT_SUPPORT
00187 STLSOFT_TEMPLATE_SPECIALISATION
00188 struct do_construction<ss_sint64_t> { enum { value = false }; typedef two_type type; };
00189
00190 STLSOFT_TEMPLATE_SPECIALISATION
00191 struct do_construction<ss_uint64_t> { enum { value = false }; typedef two_type type; };
00192 #endif
00193
00194 STLSOFT_TEMPLATE_SPECIALISATION
00195 struct do_construction<float> { enum { value = false }; typedef two_type type; };
00196
00197 STLSOFT_TEMPLATE_SPECIALISATION
00198 struct do_construction<double> { enum { value = false }; typedef two_type type; };
00199
00200 STLSOFT_TEMPLATE_SPECIALISATION
00201 struct do_construction<long double> { enum { value = false }; typedef two_type type; };
00202
00203 #ifdef STLSOFT_CF_NATIVE_BOOL_SUPPORT
00204 STLSOFT_TEMPLATE_SPECIALISATION
00205 struct do_construction<ss_bool_t> { enum { value = false }; typedef two_type type; };
00206 #endif
00207
00208 #endif
00209
00210
00217 struct do_construction_always
00218 {
00219 enum { value = true };
00220
00221 typedef one_type type;
00222 };
00223
00230 struct do_construction_never
00231 {
00232 enum { value = false };
00233
00234 typedef two_type type;
00235 };
00236
00243 struct do_initialisation_never
00244 {
00245 enum { value = false };
00246
00247 typedef three_type type;
00248 };
00249
00250
00251
00252
00253
00254 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00255
00256 template< ss_typename_param_k T
00257 , ss_typename_param_k A
00258 >
00259 void do_construct_1(A& ator, T *p, ss_size_t n, one_type)
00260 {
00261 for(T *e = p + n; p != e; ++p)
00262 {
00263 ator.construct(p, T());
00264 }
00265 }
00266
00267 template< ss_typename_param_k T
00268 , ss_typename_param_k A
00269 >
00270 void do_construct_1(A& , T *p, ss_size_t n, two_type)
00271 {
00272 #if 1
00273 ::memset(p, 0, n * sizeof(T));
00274 #else
00275 stlsoft_ns_qual_std(fill_n)(p, n, 0);
00276 #endif
00277 }
00278
00279 template< ss_typename_param_k T
00280 , ss_typename_param_k A
00281 >
00282 void do_construct_1(A& , T * , ss_size_t , three_type)
00283 {}
00284
00285
00286
00287
00288
00289 template< ss_typename_param_k T
00290 , ss_typename_param_k A
00291 >
00292 void do_construct_2(A& ator, T *p, ss_size_t n, T const& value, one_type)
00293 {
00294 #if 0
00295 std::uninitialized_fill_n(p, n, value);
00296 #else
00297 for(T *e = p + n; p != e; ++p)
00298 {
00299 ator.construct(p, value);
00300 }
00301 #endif
00302 }
00303
00304 template< ss_typename_param_k T
00305 , ss_typename_param_k A
00306 >
00307 void do_construct_2(A& , T* p, ss_size_t n, T const& value, two_type)
00308 {
00309 for(T* e = p + n; p != e; ++p)
00310 {
00311 ::memcpy(p, &value, sizeof(T));
00312 }
00313 }
00314
00315 template< ss_typename_param_k T
00316 , ss_typename_param_k A
00317 >
00318 void do_construct_2(A& , T* , ss_size_t , T const& value, three_type)
00319 {}
00320
00321
00322
00323
00324
00325 template< ss_typename_param_k T
00326 , ss_typename_param_k A
00327 >
00328 void do_copy_construct_1(A& ator, T* p, T const* src, ss_size_t n, one_type)
00329 {
00330 for(T* e = p + n; p != e; ++p, ++src)
00331 {
00332 ator.construct(p, *src);
00333 }
00334 }
00335
00336 template< ss_typename_param_k T
00337 , ss_typename_param_k A
00338 >
00339 void do_copy_construct_1(A& , T* p, T const* src, ss_size_t n, two_type)
00340 {
00341 for(T* e = p + n; p != e; ++p, ++src)
00342 {
00343 ::memcpy(p, src, sizeof(T));
00344 }
00345 }
00346
00347 template< ss_typename_param_k T
00348 , ss_typename_param_k A
00349 >
00350 void do_copy_construct_1(A& , T* , T const* , ss_size_t , three_type)
00351 {}
00352
00353
00354
00355
00356
00357 template< ss_typename_param_k T
00358 , ss_typename_param_k A
00359 >
00360 void do_destroy_1(A& ator, T* p, ss_size_t n, one_type)
00361 {
00362 for(T* e = p + n; p != e; ++p)
00363 {
00364 ator.destroy(p);
00365 }
00366 }
00367
00368 template< ss_typename_param_k T
00369 , ss_typename_param_k A
00370 >
00371 void do_destroy_1(A& , T* , ss_size_t , two_type)
00372 {}
00373
00374 template< ss_typename_param_k T
00375 , ss_typename_param_k A
00376 >
00377 void do_destroy_1(A& , T* , ss_size_t , three_type)
00378 {}
00379
00380 #endif
00381
00382
00383
00384
00385
00386 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00387
00388 template< ss_typename_param_k T
00389 , ss_typename_param_k A
00390 , ss_typename_param_k P
00391 >
00392 struct array_range_initialiser
00393 {
00394 public:
00395 typedef T value_type;
00396 typedef T* pointer;
00397 typedef T const* const_pointer;
00398 typedef A allocator_type;
00399 typedef P initialisation_policy_type;
00400 private:
00401 # if defined(STLSOFT_COMPILER_IS_MSVC) && \
00402 _MSC_VER < 1310
00403 typedef initialisation_policy_type::type selector_type;
00404 # else
00405 typedef ss_typename_type_k initialisation_policy_type::type selector_type;
00406 # endif
00407
00408 public:
00415 static void construct(allocator_type& ator, pointer p, ss_size_t n)
00416 {
00417 do_construct_1(ator, p, n, selector_type());
00418 }
00419
00422 static void copy_construct(allocator_type& ator, pointer p, const_pointer src, ss_size_t n)
00423 {
00424 do_copy_construct_1(ator, p, src, n, selector_type());
00425 }
00426
00429 static void construct(allocator_type& ator, pointer p, ss_size_t n, value_type const& val)
00430 {
00431 do_construct_2(ator, p, n, val, selector_type());
00432 }
00433
00434 static void destroy(allocator_type& ator, pointer p, ss_size_t n)
00435 {
00436 do_destroy_1(ator, p, n, selector_type());
00437 }
00438 };
00439
00440 #endif
00441
00442
00443
00444 #ifndef _STLSOFT_NO_NAMESPACE
00445 }
00446 #endif
00447
00448
00449
00450 #endif
00451
00452