aboutsummaryrefslogtreecommitdiff
path: root/libxsde
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2009-03-11 15:09:17 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2009-03-11 15:09:17 +0200
commitf8bb2faef4b272ed150eb3ca4cedaa79da410694 (patch)
treefff08a4d3ce6380709c84dc6b93d02de097dd7d5 /libxsde
parentda1ce0f39a36a2fca1f8d51a67b92be6368ddbfd (diff)
Allow initialization of pod_seq and fix_seq from a C array
Use this in the hybrid/binary/custom example.
Diffstat (limited to 'libxsde')
-rw-r--r--libxsde/xsde/cxx/hybrid/sequence.hxx14
-rw-r--r--libxsde/xsde/cxx/hybrid/sequence.ixx30
-rw-r--r--libxsde/xsde/cxx/hybrid/sequence.txx28
-rw-r--r--libxsde/xsde/cxx/sequence-base.hxx2
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_;