aboutsummaryrefslogtreecommitdiff
path: root/libxsde/xsde/cxx/hybrid/sequence.txx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2010-10-07 14:48:13 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2010-10-07 14:48:13 +0200
commit4f38adc11ab1a3a1ab2dd3f958c917182be7d71f (patch)
treefd4242b2fb5648536a6307a18442abfcaf280573 /libxsde/xsde/cxx/hybrid/sequence.txx
parent0baca4b033509b6c4ebfabfb74bf6518c3b1182c (diff)
Implement generation of clone functions
New test: clone.
Diffstat (limited to 'libxsde/xsde/cxx/hybrid/sequence.txx')
-rw-r--r--libxsde/xsde/cxx/hybrid/sequence.txx48
1 files changed, 46 insertions, 2 deletions
diff --git a/libxsde/xsde/cxx/hybrid/sequence.txx b/libxsde/xsde/cxx/hybrid/sequence.txx
index b79e9d5..5d7df7d 100644
--- a/libxsde/xsde/cxx/hybrid/sequence.txx
+++ b/libxsde/xsde/cxx/hybrid/sequence.txx
@@ -30,7 +30,9 @@ namespace xsde
void fix_sequence<T>::
assign (const T* p, size_t n)
{
- clear ();
+ if (size_ != 0)
+ clear ();
+
reserve (n);
for (; size_ < n; ++size_)
@@ -41,7 +43,8 @@ namespace xsde
sequence_base::error fix_sequence<T>::
assign (const T* p, size_t n)
{
- clear ();
+ if (size_ != 0)
+ clear ();
if (error r = reserve (n))
return r;
@@ -166,6 +169,47 @@ namespace xsde
size_ = 0;
}
+
+#ifdef XSDE_EXCEPTIONS
+ template <typename T>
+ void var_sequence<T>::
+ copy (var_sequence& c) const
+ {
+ if (c.size_ != 0)
+ c.clear ();
+
+ c.reserve (size_);
+
+ for (; c.size_ < size_; ++c.size_)
+ {
+ static_cast<T**> (c.data_)[c.size_] =
+ static_cast<T**> (data_)[c.size_]->_clone ();
+ }
+ }
+#else
+ template <typename T>
+ sequence_base::error var_sequence<T>::
+ copy (var_sequence& c) const
+ {
+ if (c.size_ != 0)
+ c.clear ();
+
+ if (error r = c.reserve (size_))
+ return r;
+
+ for (; c.size_ < size_; ++c.size_)
+ {
+ T* x = static_cast<T**> (data_)[c.size_]->_clone ();
+
+ if (x == 0)
+ return error_no_memory;
+
+ static_cast<T**> (c.data_)[c.size_] = x;
+ }
+
+ return error_none;
+ }
+#endif
}
}
}