aboutsummaryrefslogtreecommitdiff
path: root/libxsde/xsde/cxx/hybrid/sequence.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'libxsde/xsde/cxx/hybrid/sequence.hxx')
-rw-r--r--libxsde/xsde/cxx/hybrid/sequence.hxx921
1 files changed, 921 insertions, 0 deletions
diff --git a/libxsde/xsde/cxx/hybrid/sequence.hxx b/libxsde/xsde/cxx/hybrid/sequence.hxx
new file mode 100644
index 0000000..d7f6dcb
--- /dev/null
+++ b/libxsde/xsde/cxx/hybrid/sequence.hxx
@@ -0,0 +1,921 @@
+// file : xsde/cxx/hybrid/sequence.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_HYBRID_SEQUENCE_HXX
+#define XSDE_CXX_HYBRID_SEQUENCE_HXX
+
+#include <stddef.h> // size_t, ptrdiff_t
+
+#include <xsde/cxx/config.hxx>
+#include <xsde/cxx/sequence-base.hxx>
+
+#ifdef XSDE_STL
+# include <xsde/cxx/string-sequence-stl.hxx>
+#else
+# include <xsde/cxx/string-sequence.hxx>
+#endif
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace hybrid
+ {
+ // Sequence with fixed-length POD elements.
+ //
+ template <typename T>
+ class pod_seq: public sequence_base
+ {
+ public:
+ typedef T value_type;
+ typedef T* pointer;
+ typedef const T* const_pointer;
+ typedef T& reference;
+ typedef const T& const_reference;
+
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+
+ typedef T* iterator;
+ typedef const T* const_iterator;
+
+ public:
+ iterator
+ begin ();
+
+ const_iterator
+ begin () const;
+
+ iterator
+ end ();
+
+ const_iterator
+ end () const;
+
+ T&
+ front ();
+
+ const T&
+ front () const;
+
+ T&
+ back ();
+
+ const T&
+ back () const;
+
+ T&
+ operator[] (size_t);
+
+ const T&
+ operator[] (size_t) const;
+
+ public:
+ size_t
+ max_size () const;
+
+ void
+ clear ();
+
+ void
+ pop_back ();
+
+ iterator
+ erase (iterator);
+
+#ifndef XSDE_EXCEPTIONS
+ error
+#else
+ void
+#endif
+ push_back (const T&);
+
+#ifndef XSDE_EXCEPTIONS
+ error
+ insert (iterator, const T&);
+
+ error
+ insert (iterator, const T&, iterator& result);
+#else
+ iterator
+ insert (iterator, const T&);
+#endif
+
+#ifndef XSDE_EXCEPTIONS
+ error
+#else
+ void
+#endif
+ reserve (size_t);
+
+ void
+ swap (pod_seq&);
+ };
+
+ // Sequence with fixed-length elements.
+ //
+ template <typename T>
+ class fix_seq: public sequence_base
+ {
+ public:
+ typedef T value_type;
+ typedef T* pointer;
+ typedef const T* const_pointer;
+ typedef T& reference;
+ typedef const T& const_reference;
+
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+
+ typedef T* iterator;
+ typedef const T* const_iterator;
+
+ public:
+ ~fix_seq ();
+
+ public:
+ iterator
+ begin ();
+
+ const_iterator
+ begin () const;
+
+ iterator
+ end ();
+
+ const_iterator
+ end () const;
+
+ T&
+ front ();
+
+ const T&
+ front () const;
+
+ T&
+ back ();
+
+ const T&
+ back () const;
+
+ T&
+ operator[] (size_t);
+
+ const T&
+ operator[] (size_t) const;
+
+ public:
+ size_t
+ max_size () const;
+
+ void
+ clear ();
+
+ void
+ pop_back ();
+
+ iterator
+ erase (iterator);
+
+#ifndef XSDE_EXCEPTIONS
+ error
+#else
+ void
+#endif
+ push_back (const T&);
+
+#ifndef XSDE_EXCEPTIONS
+ error
+ insert (iterator, const T&);
+
+ error
+ insert (iterator, const T&, iterator& result);
+#else
+ iterator
+ insert (iterator, const T&);
+#endif
+
+#ifndef XSDE_EXCEPTIONS
+ error
+#else
+ void
+#endif
+ reserve (size_t);
+
+ void
+ swap (fix_seq&);
+
+ private:
+ static void
+ move_ (void* dst, void* src, size_t n);
+
+ static void
+ move_forward_ (void* p, size_t n);
+
+#ifdef XSDE_EXCEPTIONS
+ static void
+ move_backward_ (void* p, size_t n, size_t& size);
+#else
+ static void
+ move_backward_ (void* p, size_t n);
+#endif
+
+#ifdef XSDE_EXCEPTIONS
+ struct guard
+ {
+ guard (T* p, size_t& n) : p_ (p), n_ (n) {}
+
+ ~guard ()
+ {
+ if (p_)
+ for (; n_ > 0; --n_)
+ p_[n_ - 1].~T ();
+ }
+
+ void
+ release () { p_ = 0; }
+
+ private:
+ T* p_;
+ size_t& n_;
+ };
+#endif
+ };
+
+ // Sequence with variable-length elements.
+ //
+ template <typename T>
+ class var_iterator
+ {
+ public:
+ typedef T value_type;
+ typedef T& reference;
+ typedef T* pointer;
+
+ typedef ptrdiff_t difference_type;
+
+ public:
+ var_iterator ()
+ : i_ (0)
+ {
+ }
+
+ explicit
+ var_iterator (T** i)
+ : i_ (i)
+ {
+ }
+
+ public:
+ // Forward iterator requirements.
+ //
+ T&
+ operator* () const
+ {
+ return **i_;
+ }
+
+ T*
+ operator-> () const
+ {
+ return *i_;
+ }
+
+ var_iterator&
+ operator++ ()
+ {
+ ++i_;
+ return *this;
+ }
+
+ var_iterator
+ operator++ (int)
+ {
+ var_iterator r (*this);
+ ++i_;
+ return r;
+ }
+
+ // Bidirectional iterator requirements.
+ //
+ var_iterator&
+ operator-- ()
+ {
+ --i_;
+ return *this;
+ }
+
+ var_iterator
+ operator-- (int)
+ {
+ var_iterator r (*this);
+ --i_;
+ return r;
+ }
+
+ // Random access iterator requirements.
+ //
+ T&
+ operator[] (ptrdiff_t n) const
+ {
+ return *(i_[n]);
+ }
+
+ var_iterator&
+ operator+= (ptrdiff_t n)
+ {
+ i_ += n;
+ return *this;
+ }
+
+ var_iterator
+ operator+ (ptrdiff_t n) const
+ {
+ return var_iterator (i_ + n);
+ }
+
+ var_iterator&
+ operator-= (ptrdiff_t n)
+ {
+ i_ -= n;
+ return *this;
+ }
+
+ var_iterator
+ operator- (ptrdiff_t n) const
+ {
+ return var_iterator (i_ - n);
+ }
+
+ public:
+ T** i_;
+ };
+
+ template <typename T>
+ class var_const_iterator
+ {
+ public:
+ typedef const T value_type;
+ typedef const T& reference;
+ typedef const T* pointer;
+
+ typedef ptrdiff_t difference_type;
+
+ public:
+ var_const_iterator ()
+ : i_ (0)
+ {
+ }
+
+ var_const_iterator (var_iterator<T> j)
+ : i_ (const_cast<const T**> (j.i_))
+ {
+ }
+
+ explicit
+ var_const_iterator (const T** i)
+ : i_ (i)
+ {
+ }
+
+ var_const_iterator&
+ operator= (var_const_iterator j)
+ {
+ i_ = j.i_;
+ return *this;
+ }
+
+ var_const_iterator&
+ operator= (var_iterator<T> j)
+ {
+ i_ = const_cast<const T**> (j.i_);
+ return *this;
+ }
+
+ public:
+ // Forward iterator requirements.
+ //
+ const T&
+ operator* () const
+ {
+ return **i_;
+ }
+
+ const T*
+ operator-> () const
+ {
+ return *i_;
+ }
+
+ var_const_iterator&
+ operator++ ()
+ {
+ ++i_;
+ return *this;
+ }
+
+ var_const_iterator
+ operator++ (int)
+ {
+ var_const_iterator r (*this);
+ ++i_;
+ return r;
+ }
+
+ // Bidirectional iterator requirements.
+ //
+ var_const_iterator&
+ operator-- ()
+ {
+ --i_;
+ return *this;
+ }
+
+ var_const_iterator
+ operator-- (int)
+ {
+ var_const_iterator r (*this);
+ --i_;
+ return r;
+ }
+
+ // Random access iterator requirements.
+ //
+ const T&
+ operator[] (ptrdiff_t n) const
+ {
+ return *(i_[n]);
+ }
+
+ var_const_iterator&
+ operator+= (ptrdiff_t n)
+ {
+ i_ += n;
+ return *this;
+ }
+
+ var_const_iterator
+ operator+ (ptrdiff_t n) const
+ {
+ return var_const_iterator (i_ + n);
+ }
+
+ var_const_iterator&
+ operator-= (ptrdiff_t n)
+ {
+ i_ -= n;
+ return *this;
+ }
+
+ var_const_iterator
+ operator- (ptrdiff_t n) const
+ {
+ return var_const_iterator (i_ - n);
+ }
+
+ public:
+ const T** i_;
+ };
+
+ // Forward iterator requirements.
+ //
+ template <typename T>
+ inline bool
+ operator== (var_iterator<T> i, var_iterator<T> j)
+ {
+ return i.i_ == j.i_;
+ }
+
+ template <typename T>
+ inline bool
+ operator== (var_const_iterator<T> i, var_const_iterator<T> j)
+ {
+ return i.i_ == j.i_;
+ }
+
+ template <typename T>
+ inline bool
+ operator== (var_iterator<T> i, var_const_iterator<T> j)
+ {
+ // eVC++ 4.0 needs the cast.
+ //
+ return const_cast<const T**> (i.i_) == j.i_;
+ }
+
+ template <typename T>
+ inline bool
+ operator== (var_const_iterator<T> i, var_iterator<T> j)
+ {
+ return i.i_ == const_cast<const T**> (j.i_);
+ }
+
+ template <typename T>
+ inline bool
+ operator!= (var_iterator<T> i, var_iterator<T> j)
+ {
+ return i.i_ != j.i_;
+ }
+
+ template <typename T>
+ inline bool
+ operator!= (var_const_iterator<T> i, var_const_iterator<T> j)
+ {
+ return i.i_ != j.i_;
+ }
+
+ template <typename T>
+ inline bool
+ operator!= (var_iterator<T> i, var_const_iterator<T> j)
+ {
+ return const_cast<const T**> (i.i_) != j.i_;
+ }
+
+ template <typename T>
+ inline bool
+ operator!= (var_const_iterator<T> i, var_iterator<T> j)
+ {
+ return i.i_ != const_cast<const T**> (j.i_);
+ }
+
+ // Random access iterator requirements
+ //
+ template <typename T>
+ inline bool
+ operator< (var_iterator<T> i, var_iterator<T> j)
+ {
+ return i.i_ < j.i_;
+ }
+
+ template <typename T>
+ inline bool
+ operator< (var_const_iterator<T> i, var_const_iterator<T> j)
+ {
+ return i.i_ < j.i_;
+ }
+
+ template <typename T>
+ inline bool
+ operator< (var_iterator<T> i, var_const_iterator<T> j)
+ {
+ return const_cast<const T**> (i.i_) < j.i_;
+ }
+
+ template <typename T>
+ inline bool
+ operator< (var_const_iterator<T> i, var_iterator<T> j)
+ {
+ return i.i_ < const_cast<const T**> (j.i_);
+ }
+
+ template <typename T>
+ inline bool
+ operator> (var_iterator<T> i, var_iterator<T> j)
+ {
+ return i.i_ > j.i_;
+ }
+
+ template <typename T>
+ inline bool
+ operator> (var_const_iterator<T> i, var_const_iterator<T> j)
+ {
+ return i.i_ > j.i_;
+ }
+
+ template <typename T>
+ inline bool
+ operator> (var_iterator<T> i, var_const_iterator<T> j)
+ {
+ return const_cast<const T**> (i.i_) > j.i_;
+ }
+
+ template <typename T>
+ inline bool
+ operator> (var_const_iterator<T> i, var_iterator<T> j)
+ {
+ return i.i_ > const_cast<const T**> (j.i_);
+ }
+
+ template <typename T>
+ inline bool
+ operator<= (var_iterator<T> i, var_iterator<T> j)
+ {
+ return i.i_ <= j.i_;
+ }
+
+ template <typename T>
+ inline bool
+ operator<= (var_const_iterator<T> i, var_const_iterator<T> j)
+ {
+ return i.i_ <= j.i_;
+ }
+
+ template <typename T>
+ inline bool
+ operator<= (var_iterator<T> i, var_const_iterator<T> j)
+ {
+ return const_cast<const T**> (i.i_) <= j.i_;
+ }
+
+ template <typename T>
+ inline bool
+ operator<= (var_const_iterator<T> i, var_iterator<T> j)
+ {
+ return i.i_ <= const_cast<const T**> (j.i_);
+ }
+
+ template <typename T>
+ inline bool
+ operator>= (var_iterator<T> i, var_iterator<T> j)
+ {
+ return i.i_ >= j.i_;
+ }
+
+ template <typename T>
+ inline bool
+ operator>= (var_const_iterator<T> i, var_const_iterator<T> j)
+ {
+ return i.i_ >= j.i_;
+ }
+
+ template <typename T>
+ inline bool
+ operator>= (var_iterator<T> i, var_const_iterator<T> j)
+ {
+ return const_cast<const T**> (i.i_) >= j.i_;
+ }
+
+ template <typename T>
+ inline bool
+ operator>= (var_const_iterator<T> i, var_iterator<T> j)
+ {
+ return i.i_ >= const_cast<const T**> (j.i_);
+ }
+
+ template <typename T>
+ inline ptrdiff_t
+ operator- (var_iterator<T> i, var_iterator<T> j)
+ {
+ return i.i_ - j.i_;
+ }
+
+ template <typename T>
+ inline ptrdiff_t
+ operator- (var_const_iterator<T> i, var_const_iterator<T> j)
+ {
+ return i.i_ - j.i_;
+ }
+
+ template <typename T>
+ inline ptrdiff_t
+ operator- (var_iterator<T> i, var_const_iterator<T> j)
+ {
+ return const_cast<const T**> (i.i_) - j.i_;
+ }
+
+ template <typename T>
+ inline ptrdiff_t
+ operator- (var_const_iterator<T> i, var_iterator<T> j)
+ {
+ return i.i_ - const_cast<const T**> (j.i_);
+ }
+
+ template <typename T>
+ inline var_iterator<T>
+ operator+ (ptrdiff_t n, var_iterator<T> i)
+ {
+ return var_iterator<T> (i.i_ + n);
+ }
+
+ template <typename T>
+ inline var_iterator<T>
+ operator+ (ptrdiff_t n, var_const_iterator<T> i)
+ {
+ return var_const_iterator<T> (i.i_ + n);
+ }
+
+ //
+ //
+ template <typename T>
+ class var_seq: public sequence_base
+ {
+ public:
+ typedef T value_type;
+ typedef T* pointer;
+ typedef const T* const_pointer;
+ typedef T& reference;
+ typedef const T& const_reference;
+
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+
+ typedef var_iterator<T> iterator;
+ typedef var_const_iterator<T> const_iterator;
+
+ public:
+ ~var_seq ();
+
+ public:
+ iterator
+ begin ();
+
+ const_iterator
+ begin () const;
+
+ iterator
+ end ();
+
+ const_iterator
+ end () const;
+
+ T&
+ front ();
+
+ const T&
+ front () const;
+
+ T&
+ back ();
+
+ const T&
+ back () const;
+
+ T&
+ operator[] (size_t);
+
+ const T&
+ operator[] (size_t) const;
+
+ public:
+ size_t
+ max_size () const;
+
+ void
+ clear ();
+
+ void
+ pop_back ();
+
+ iterator
+ erase (iterator);
+
+#ifndef XSDE_EXCEPTIONS
+ error
+#else
+ void
+#endif
+ push_back (T*);
+
+#ifndef XSDE_EXCEPTIONS
+ error
+ insert (iterator, T*);
+
+ error
+ insert (iterator, T*, iterator& result);
+#else
+ iterator
+ insert (iterator, T*);
+#endif
+
+#ifndef XSDE_EXCEPTIONS
+ error
+#else
+ void
+#endif
+ reserve (size_t);
+
+ void
+ swap (var_seq&);
+
+#ifdef XSDE_EXCEPTIONS
+ private:
+ struct guard
+ {
+ ~guard () { delete p_; }
+ guard (T* p) : p_ (p) {}
+
+ void
+ release () { p_ = 0; }
+
+ private:
+ T* p_;
+ };
+#endif
+ };
+
+
+ // String sequence.
+ //
+ typedef string_sequence str_seq;
+
+
+ // Custom data sequence.
+ //
+ class data_seq: public sequence_base
+ {
+ public:
+ typedef void* value_type;
+ typedef void** pointer;
+ typedef const void** const_pointer;
+ typedef void* reference;
+ typedef const void* const_reference;
+
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+
+ typedef void** iterator;
+ typedef const void* const* const_iterator;
+
+ public:
+ ~data_seq ();
+ data_seq ();
+
+ typedef void (*destroy_func) (void* data, size_t pos);
+
+ void
+ destructor (destroy_func);
+
+ public:
+ iterator
+ begin ();
+
+ const_iterator
+ begin () const;
+
+ iterator
+ end ();
+
+ const_iterator
+ end () const;
+
+ void*
+ front ();
+
+ const void*
+ front () const;
+
+ void*
+ back ();
+
+ const void*
+ back () const;
+
+ void*
+ operator[] (size_t);
+
+ const void*
+ operator[] (size_t) const;
+
+ public:
+ size_t
+ max_size () const;
+
+ void
+ clear ();
+
+ void
+ pop_back ();
+
+ iterator
+ erase (iterator);
+
+#ifndef XSDE_EXCEPTIONS
+ error
+#else
+ void
+#endif
+ push_back (void*);
+
+#ifndef XSDE_EXCEPTIONS
+ error
+ insert (iterator, void*);
+
+ error
+ insert (iterator, void*, iterator& result);
+#else
+ iterator
+ insert (iterator, void*);
+#endif
+
+#ifndef XSDE_EXCEPTIONS
+ error
+#else
+ void
+#endif
+ reserve (size_t);
+
+ void
+ swap (data_seq&);
+
+ private:
+ destroy_func destructor_;
+ };
+ }
+ }
+}
+
+#include <xsde/cxx/hybrid/sequence.ixx>
+#include <xsde/cxx/hybrid/sequence.txx>
+
+#endif // XSDE_CXX_HYBRID_SEQUENCE_HXX