// file : xsde/cxx/hybrid/sequence.txx // author : Boris Kolpackov // copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC // license : GNU GPL v2 + exceptions; see accompanying LICENSE file #include // placement new namespace xsde { namespace cxx { namespace hybrid { // // fix_seq // template void fix_seq:: clear () { for (size_t i = 0; i < size_; ++i) static_cast (data_)[i].~T (); size_ = 0; } #ifdef XSDE_EXCEPTIONS template void fix_seq:: assign (const T* p, size_t n) { clear (); reserve (n); for (; size_ < n; ++size_) new (static_cast (data_) + size_) T (p[size_]); } #else template sequence_base::error fix_seq:: assign (const T* p, size_t n) { clear (); if (error r = reserve (n)) return r; for (; size_ < n; ++size_) new (static_cast (data_) + size_) T (p[size_]); return error_none; } #endif #ifdef XSDE_EXCEPTIONS template void fix_seq:: move_ (void* dst, void* src, size_t n) { T* d = static_cast (dst); T* s = static_cast (src); // The copy c-tor can throw in which case we need to destroy // whatever objects we already copied into d. // size_t i = 0; guard g (d, i); for (; i < n; i++) new (d + i) T (s[i]); g.release (); for (size_t j = 0; j < n; j++) s[j].~T (); } #else template void fix_seq:: move_ (void* dst, void* src, size_t n) { T* d = static_cast (dst); T* s = static_cast (src); for (size_t i = 0; i < n; i++) { new (d + i) T (s[i]); s[i].~T (); } } #endif template void fix_seq:: move_forward_ (void* p, size_t n) { // We are moving a sequence of elements one position to the left. // The tricky part is to make sure we are in at least destructable // state if things turn bad. We assume that there is a valid // element at position p. // T* d = static_cast (p); for (size_t i = 0; i < n; i++) d[i] = d[i + 1]; d[n].~T (); } #ifdef XSDE_EXCEPTIONS template void fix_seq:: move_backward_ (void* p, size_t n, size_t& size) { // We are moving a sequence of elements one position to the right. // The tricky part is to make sure we are in at least destructable // state if things turn bad. // T* d = static_cast (p); T* e = d + n; new (e) T; size++; for (size_t i = n; i > 0; i--) d[i] = d[i - 1]; } #else template void fix_seq:: move_backward_ (void* p, size_t n) { // We are moving a sequence of elements one position to the right. // T* d = static_cast (p); T* e = d + n; new (e) T; for (size_t i = n; i > 0; i--) d[i] = d[i - 1]; } #endif // // var_seq // template void var_seq:: clear () { for (size_t i = 0; i < size_; ++i) delete static_cast (data_)[i]; size_ = 0; } } } }