summaryrefslogtreecommitdiff
path: root/xsd/libxsd/xsd/cxx/tree/containers.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'xsd/libxsd/xsd/cxx/tree/containers.hxx')
-rw-r--r--xsd/libxsd/xsd/cxx/tree/containers.hxx374
1 files changed, 62 insertions, 312 deletions
diff --git a/xsd/libxsd/xsd/cxx/tree/containers.hxx b/xsd/libxsd/xsd/cxx/tree/containers.hxx
index ba76eae..cafd79d 100644
--- a/xsd/libxsd/xsd/cxx/tree/containers.hxx
+++ b/xsd/libxsd/xsd/cxx/tree/containers.hxx
@@ -1,20 +1,19 @@
// file : xsd/cxx/tree/containers.hxx
-// author : Boris Kolpackov <boris@codesynthesis.com>
-// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC
+// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC
// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
#ifndef XSD_CXX_TREE_CONTAINERS_HXX
#define XSD_CXX_TREE_CONTAINERS_HXX
-#include <cstddef> // std::ptrdiff_t
-#include <string>
#include <vector>
-#include <memory> // std::auto_ptr
-#include <iterator> // std::iterator_traits
+#include <memory> // std::auto_ptr/unique_ptr
#include <algorithm> // std::equal, std::lexicographical_compare
#include <iosfwd>
+#include <xsd/cxx/config.hxx> // XSD_AUTO_PTR
+
#include <xsd/cxx/tree/elements.hxx>
+#include <xsd/cxx/tree/iterator-adapter.hxx>
namespace xsd
{
@@ -132,11 +131,11 @@ namespace xsd
public:
~one ();
- one (flags, container*);
+ one (container*);
- one (const T&, flags, container*);
+ one (const T&, container*);
- one (std::auto_ptr<T>, flags, container*);
+ one (XSD_AUTO_PTR<T>, container*);
one (const one&, flags, container*);
@@ -157,10 +156,13 @@ namespace xsd
}
void
- set (const T&);
+ set (const T& x)
+ {
+ set (x, 0);
+ }
void
- set (std::auto_ptr<T>);
+ set (XSD_AUTO_PTR<T>);
bool
present () const
@@ -168,18 +170,21 @@ namespace xsd
return x_ != 0;
}
- std::auto_ptr<T>
+ XSD_AUTO_PTR<T>
detach ()
{
T* x (x_);
x->_container (0);
x_ = 0;
- return std::auto_ptr<T> (x);
+ return XSD_AUTO_PTR<T> (x);
}
protected:
+ void
+ set (const T&, flags);
+
+ protected:
T* x_;
- flags flags_;
container* container_;
};
@@ -188,12 +193,12 @@ namespace xsd
class one<T, true>
{
public:
- one (flags, container*)
+ one (container*)
: present_ (false)
{
}
- one (const T& x, flags, container*)
+ one (const T& x, container*)
: x_ (x), present_ (true)
{
}
@@ -246,9 +251,6 @@ namespace xsd
bool present_;
};
-
- // Note that I cannot get rid of fund because of HP aCC3.
- //
template <typename T, bool fund = fundamental_p<T>::r>
class optional;
@@ -259,13 +261,13 @@ namespace xsd
~optional ();
explicit
- optional (flags = 0, container* = 0);
+ optional (container* = 0);
explicit
- optional (const T&, flags = 0, container* = 0);
+ optional (const T&, container* = 0);
explicit
- optional (std::auto_ptr<T>, flags = 0, container* = 0);
+ optional (XSD_AUTO_PTR<T>, container* = 0);
optional (const optional&, flags = 0, container* = 0);
@@ -332,30 +334,35 @@ namespace xsd
}
void
- set (const T&);
+ set (const T& x)
+ {
+ set (x, 0);
+ }
void
- set (std::auto_ptr<T>);
+ set (XSD_AUTO_PTR<T>);
void
reset ();
- std::auto_ptr<T>
+ XSD_AUTO_PTR<T>
detach ()
{
T* x (x_);
x->_container (0);
x_ = 0;
- return std::auto_ptr<T> (x);
+ return XSD_AUTO_PTR<T> (x);
}
- private:
+ protected:
+ void
+ set (const T&, flags);
+
void
true_ ();
- private:
+ protected:
T* x_;
- flags flags_;
container* container_;
};
@@ -367,13 +374,13 @@ namespace xsd
{
public:
explicit
- optional (flags = 0, container* = 0)
+ optional (container* = 0)
: present_ (false)
{
}
explicit
- optional (const T&, flags = 0, container* = 0);
+ optional (const T&, container* = 0);
optional (const optional&, flags = 0, container* = 0);
@@ -506,7 +513,7 @@ namespace xsd
return !(a < b);
}
- // Provide an ostream insertion opretaor to prevent confusion from
+ // Provide an ostream insertion operator to prevent confusion from
// the implicit bool conversion.
//
template <typename C, typename T, bool fund>
@@ -516,264 +523,9 @@ namespace xsd
// Sequence.
//
-
- // Note that I cannot get rid of 'fund' because HP aCC3 likes it
- // this way.
- //
template <typename T, bool fund = fundamental_p<T>::r>
class sequence;
-
- // Sun CC's <iterator> does not have iterator_traits. To overcome
- // this, we will wrap std::iterator_traits into our own and also
- // specialize it for pointer types. Since Sun CC uses pointer
- // for vector::iterator, it will use the specialization and won't
- // notice the std::iterator_traits.
- //
-#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
- template <typename I>
- struct iterator_traits
- {
- typedef
- typename std::iterator_traits<I>::iterator_category
- iterator_category;
-
- typedef
- typename std::iterator_traits<I>::value_type
- value_type;
-
- typedef
- typename std::iterator_traits<I>::difference_type
- difference_type;
- };
-#else
- // The Pointer specialization does not work for reverse and
- // set iterators. But these iterators are user-dfined types
- // and have suitable typedefs that we can use.
- //
- template <typename I>
- struct iterator_traits
- {
- typedef typename I::iterator_category iterator_category;
- typedef typename I::value_type value_type;
- typedef typename I::difference_type difference_type;
- };
-
- template <typename T>
- struct iterator_traits<T*>
- {
- typedef std::random_access_iterator_tag iterator_category;
- typedef T value_type;
- typedef std::ptrdiff_t difference_type;
- };
-#endif
-
- // Iterator adapter for complex types. It expects I to point to
- // a smart pointer-like object that has operator*() that returns
- // a refernce to a type static_cast'able to T and get() that
- // returns a pointer to a type static_cast'able to T.
- //
-
- template <typename I, typename T>
- struct iterator_adapter
- {
- typedef T value_type;
- typedef value_type& reference;
- typedef value_type* pointer;
-
- typedef
- typename iterator_traits<I>::iterator_category
- iterator_category;
-
- typedef
- typename iterator_traits<I>::difference_type
- difference_type;
-
-
- public:
- iterator_adapter ()
- : i_ () // i_ can be of a pointer type.
- {
- }
-
- // Allow iterator to const_iterator conversion.
- //
- template <typename J, typename T2>
- iterator_adapter (const iterator_adapter<J, T2>& j)
- : i_ (j.base ())
- {
- }
-
- explicit
- iterator_adapter (const I& i)
- : i_ (i)
- {
- }
-
- public:
- // Forward iterator requirements.
- //
- reference
- operator* () const
- {
- return static_cast<reference> (**i_);
- }
-
- pointer
- operator-> () const
- {
- return static_cast<pointer> (i_->get ());
- }
-
- iterator_adapter&
- operator++ ()
- {
- ++i_;
- return *this;
- }
-
- iterator_adapter
- operator++ (int)
- {
- iterator_adapter r (*this);
- ++i_;
- return r;
- }
-
- // Bidirectional iterator requirements.
- //
- iterator_adapter&
- operator-- ()
- {
- --i_;
- return *this;
- }
-
- iterator_adapter
- operator-- (int)
- {
- iterator_adapter r (*this);
- --i_;
- return r;
- }
-
- // Random access iterator requirements.
- //
- reference
- operator[] (difference_type n) const
- {
- return static_cast<reference> (*(i_[n]));
- }
-
- iterator_adapter&
- operator+= (difference_type n)
- {
- i_ += n;
- return *this;
- }
-
- iterator_adapter
- operator+ (difference_type n) const
- {
- return iterator_adapter (i_ + n);
- }
-
- iterator_adapter&
- operator-= (difference_type n)
- {
- i_ -= n;
- return *this;
- }
-
- iterator_adapter
- operator- (difference_type n) const
- {
- return iterator_adapter (i_ - n);
- }
-
- public:
- const I&
- base () const
- {
- return i_;
- }
-
- private:
- I i_;
- };
-
- // Note: We use different types for left- and right-hand-side
- // arguments to allow comparison between iterator and const_iterator.
- //
-
- // Forward iterator requirements.
- //
- template <typename I, typename J, typename T1, typename T2>
- inline bool
- operator== (const iterator_adapter<I, T1>& i,
- const iterator_adapter<J, T2>& j)
- {
- return i.base () == j.base ();
- }
-
- template <typename I, typename J, typename T1, typename T2>
- inline bool
- operator!= (const iterator_adapter<I, T1>& i,
- const iterator_adapter<J, T2>& j)
- {
- return i.base () != j.base ();
- }
-
- // Random access iterator requirements
- //
- template <typename I, typename J, typename T1, typename T2>
- inline bool
- operator< (const iterator_adapter<I, T1>& i,
- const iterator_adapter<J, T2>& j)
- {
- return i.base () < j.base ();
- }
-
- template <typename I, typename J, typename T1, typename T2>
- inline bool
- operator> (const iterator_adapter<I, T1>& i,
- const iterator_adapter<J, T2>& j)
- {
- return i.base () > j.base ();
- }
-
- template <typename I, typename J, typename T1, typename T2>
- inline bool
- operator<= (const iterator_adapter<I, T1>& i,
- const iterator_adapter<J, T2>& j)
- {
- return i.base () <= j.base ();
- }
-
- template <typename I, typename J, typename T1, typename T2>
- inline bool
- operator>= (const iterator_adapter<I, T1>& i,
- const iterator_adapter<J, T2>& j)
- {
- return i.base () >= j.base ();
- }
-
- template <typename I, typename J, typename T1, typename T2>
- inline typename iterator_adapter<I, T1>::difference_type
- operator- (const iterator_adapter<I, T1>& i,
- const iterator_adapter<J, T2>& j)
- {
- return i.base () - j.base ();
- }
-
- template <typename I, typename T>
- inline iterator_adapter<I, T>
- operator+ (typename iterator_adapter<I, T>::difference_type n,
- const iterator_adapter<I, T>& i)
- {
- return iterator_adapter<I, T> (i.base () + n);
- }
-
//
//
class sequence_common
@@ -859,33 +611,33 @@ namespace xsd
typedef base_sequence::allocator_type allocator_type;
protected:
- sequence_common (flags f, container* c)
- : flags_ (f), container_ (c)
+ sequence_common (container* c)
+ : container_ (c)
{
}
sequence_common (size_type n, const type& x, container* c)
- : flags_ (0), container_ (c)
+ : container_ (c)
{
assign (n, x);
}
template <typename I>
sequence_common (const I& begin, const I& end, container* c)
- : flags_ (0), container_ (c)
+ : container_ (c)
{
assign (begin, end);
}
sequence_common (const sequence_common& v, flags f, container* c)
- : flags_ (f), container_ (c)
+ : container_ (c)
{
v_.reserve (v.v_.size ());
for (base_const_iterator i (v.v_.begin ()), e (v.v_.end ());
i != e; ++i)
{
- ptr p ((**i)._clone (flags_, container_));
+ ptr p ((**i)._clone (f, container_));
v_.push_back (p);
}
}
@@ -906,7 +658,7 @@ namespace xsd
{
// We have no ptr_ref.
//
- ptr p ((**si)._clone (flags_, container_));
+ ptr p ((**si)._clone (0, container_));
*di = p;
}
@@ -958,7 +710,7 @@ namespace xsd
for (base_iterator i (v_.begin ()), e (v_.end ()); i != e; ++i)
{
- ptr p (x._clone (flags_, container_));
+ ptr p (x._clone (0, container_));
*i = p;
}
}
@@ -974,7 +726,7 @@ namespace xsd
for (I i (begin); i != end; ++i)
{
- ptr p (i->_clone (flags_, container_));
+ ptr p (i->_clone (0, container_));
v_.push_back (p);
}
}
@@ -990,7 +742,7 @@ namespace xsd
for (base_iterator i (v_.begin () + old), e (v_.end ());
i != e; ++i)
{
- ptr p (x._clone (flags_, container_));
+ ptr p (x._clone (0, container_));
*i = p;
}
}
@@ -1004,7 +756,7 @@ namespace xsd
for (base_iterator i (v_.end () - d); n != 0; --n)
{
- ptr r (x._clone (flags_, container_));
+ ptr r (x._clone (0, container_));
*(--i) = r;
}
}
@@ -1021,7 +773,7 @@ namespace xsd
for (I i (end);;)
{
--i;
- ptr r (i->_clone (flags_, container_));
+ ptr r (i->_clone (0, container_));
p = v_.insert (p, r);
if (i == begin)
@@ -1031,7 +783,6 @@ namespace xsd
}
protected:
- flags flags_;
container* container_;
base_sequence v_;
};
@@ -1075,8 +826,8 @@ namespace xsd
public:
explicit
- sequence (flags f = 0, container* c = 0)
- : sequence_common (f, c)
+ sequence (container* c = 0)
+ : sequence_common (c)
{
}
@@ -1260,11 +1011,11 @@ namespace xsd
void
push_back (const T& x)
{
- v_.push_back (ptr (x._clone (flags_, container_)));
+ v_.push_back (ptr (x._clone (0, container_)));
}
void
- push_back (std::auto_ptr<T> x)
+ push_back (XSD_AUTO_PTR<T> x)
{
if (x->_container () != container_)
x->_container (container_);
@@ -1278,7 +1029,7 @@ namespace xsd
v_.pop_back ();
}
- std::auto_ptr<T>
+ XSD_AUTO_PTR<T>
detach_back (bool pop = true)
{
ptr& p (v_.back ());
@@ -1288,7 +1039,7 @@ namespace xsd
if (pop)
v_.pop_back ();
- return std::auto_ptr<T> (x);
+ return XSD_AUTO_PTR<T> (x);
}
iterator
@@ -1296,11 +1047,11 @@ namespace xsd
{
return iterator (
v_.insert (
- position.base (), ptr (x._clone (flags_, container_))));
+ position.base (), ptr (x._clone (0, container_))));
}
iterator
- insert (iterator position, std::auto_ptr<T> x)
+ insert (iterator position, XSD_AUTO_PTR<T> x)
{
if (x->_container () != container_)
x->_container (container_);
@@ -1334,12 +1085,11 @@ namespace xsd
}
iterator
- detach (iterator position, std::auto_ptr<T>& r, bool erase = true)
+ detach (iterator position, XSD_AUTO_PTR<T>& r, bool erase = true)
{
ptr& p (*position.base ());
p->_container (0);
- std::auto_ptr<T> tmp (static_cast<T*> (p.release ()));
- r = tmp;
+ r.reset (static_cast<T*> (p.release ()));
if (erase)
return iterator (v_.erase (position.base ()));
@@ -1368,7 +1118,7 @@ namespace xsd
public:
explicit
- sequence (flags = 0, container* = 0)
+ sequence (container* = 0)
{
}