diff options
Diffstat (limited to 'libxsde/xsde')
-rw-r--r-- | libxsde/xsde/cxx/hybrid/sequence.hxx | 14 | ||||
-rw-r--r-- | libxsde/xsde/cxx/hybrid/sequence.ixx | 30 | ||||
-rw-r--r-- | libxsde/xsde/cxx/hybrid/sequence.txx | 28 | ||||
-rw-r--r-- | libxsde/xsde/cxx/sequence-base.hxx | 2 |
4 files changed, 72 insertions, 2 deletions
diff --git a/libxsde/xsde/cxx/hybrid/sequence.hxx b/libxsde/xsde/cxx/hybrid/sequence.hxx index 3e43b6d..6d8f33b 100644 --- a/libxsde/xsde/cxx/hybrid/sequence.hxx +++ b/libxsde/xsde/cxx/hybrid/sequence.hxx @@ -110,6 +110,13 @@ namespace xsde #endif reserve (size_t); +#ifndef XSDE_EXCEPTIONS + error +#else + void +#endif + assign (const T*, size_t); + void swap (pod_seq&); }; @@ -204,6 +211,13 @@ namespace xsde #endif reserve (size_t); +#ifndef XSDE_EXCEPTIONS + error +#else + void +#endif + assign (const T*, size_t); + void swap (fix_seq&); diff --git a/libxsde/xsde/cxx/hybrid/sequence.ixx b/libxsde/xsde/cxx/hybrid/sequence.ixx index c1566d2..11bc13d 100644 --- a/libxsde/xsde/cxx/hybrid/sequence.ixx +++ b/libxsde/xsde/cxx/hybrid/sequence.ixx @@ -3,7 +3,9 @@ // copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC // license : GNU GPL v2 + exceptions; see accompanying LICENSE file -#include <new> // placement new +#include <string.h> // memcpy + +#include <new> // placement new namespace xsde { @@ -154,6 +156,17 @@ namespace xsde if (capacity_ < n) grow_ (n, sizeof (T), 0); } + + template <typename T> + inline void pod_seq<T>:: + assign (const T* p, size_t n) + { + if (capacity_ < n) + grow_ (n, sizeof (T), 0); + + memcpy (data_, p, n * sizeof (T)); + size_ = n; + } #else template <typename T> inline sequence_base::error pod_seq<T>:: @@ -210,6 +223,21 @@ namespace xsde r = grow_ (n, sizeof (T), 0); return r; } + + template <typename T> + inline sequence_base::error pod_seq<T>:: + assign (const T* p, size_t n) + { + if (capacity_ < n) + { + if (error r = grow_ (n, sizeof (T), 0)) + return r; + } + + memcpy (data_, p, n * sizeof (T)); + size_ = n; + return error_none; + } #endif // diff --git a/libxsde/xsde/cxx/hybrid/sequence.txx b/libxsde/xsde/cxx/hybrid/sequence.txx index 12faa99..a81ad11 100644 --- a/libxsde/xsde/cxx/hybrid/sequence.txx +++ b/libxsde/xsde/cxx/hybrid/sequence.txx @@ -28,6 +28,34 @@ namespace xsde #ifdef XSDE_EXCEPTIONS template <typename T> void fix_seq<T>:: + assign (const T* p, size_t n) + { + clear (); + reserve (n); + + for (; size_ < n; ++size_) + new (static_cast<T*> (data_) + size_) T (p[size_]); + } +#else + template <typename T> + sequence_base::error fix_seq<T>:: + assign (const T* p, size_t n) + { + clear (); + + if (error r = reserve (n)) + return r; + + for (; size_ < n; ++size_) + new (static_cast<T*> (data_) + size_) T (p[size_]); + + return error_none; + } +#endif + +#ifdef XSDE_EXCEPTIONS + template <typename T> + void fix_seq<T>:: move_ (void* dst, void* src, size_t n) { T* d = static_cast<T*> (dst); diff --git a/libxsde/xsde/cxx/sequence-base.hxx b/libxsde/xsde/cxx/sequence-base.hxx index 057ffdf..537ee7c 100644 --- a/libxsde/xsde/cxx/sequence-base.hxx +++ b/libxsde/xsde/cxx/sequence-base.hxx @@ -70,7 +70,7 @@ namespace xsde void swap_ (sequence_base&); - public: + protected: void* data_; size_t size_; size_t capacity_; |