summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjhoffert <jhoffert@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2009-03-20 21:36:38 +0000
committerjhoffert <jhoffert@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2009-03-20 21:36:38 +0000
commitbe784f27d42a5119fbf98247313aee9fd7d3b5c0 (patch)
tree226dc5b29ff74f0a328a281fe2c1a609c88186ec
parent40fb9c5098d729684cada789c3a6bc3347e65d8c (diff)
downloadATCD-be784f27d42a5119fbf98247313aee9fd7d3b5c0.tar.gz
-rw-r--r--TAO/tao/Bounded_Basic_String_Sequence_T.h72
-rw-r--r--TAO/tao/Bounded_Object_Reference_Sequence_T.h72
-rw-r--r--TAO/tao/Generic_Sequence_T.h985
-rw-r--r--TAO/tao/MM_Sequence_Iterator_T.h959
-rw-r--r--TAO/tao/Unbounded_Basic_String_Sequence_T.h108
-rw-r--r--TAO/tao/Unbounded_Object_Reference_Sequence_T.h72
-rw-r--r--TAO/tao/Unbounded_Value_Sequence_T.h65
-rw-r--r--TAO/tao/orbconf.h4
8 files changed, 2337 insertions, 0 deletions
diff --git a/TAO/tao/Bounded_Basic_String_Sequence_T.h b/TAO/tao/Bounded_Basic_String_Sequence_T.h
index c056bc2c60c..96f2408947a 100644
--- a/TAO/tao/Bounded_Basic_String_Sequence_T.h
+++ b/TAO/tao/Bounded_Basic_String_Sequence_T.h
@@ -14,6 +14,7 @@
#include "tao/Generic_Sequence_T.h"
#include "tao/String_Sequence_Element_T.h"
#include "tao/String_Const_Sequence_Element_T.h"
+#include "tao/MM_Sequence_Iterator_T.h"
TAO_BEGIN_VERSIONED_NAMESPACE_DECL
@@ -105,6 +106,77 @@ public:
implementation_type::freebuf(buffer);
}
+#if TAO_HAS_SEQUENCE_ITERATORS
+
+ ///
+ /// Additions to support iterator semantics for TAO unbounded basic
+ /// string sequences.
+ ///
+
+ // = Traits and factory methods that create iterators.
+ typedef MM_Sequence_Iterator<bounded_basic_string_sequence<charT, MAX> > iterator;
+ typedef Const_MM_Sequence_Iterator<bounded_basic_string_sequence<charT, MAX> > const_iterator;
+ typedef MM_Sequence_Reverse_Iterator<bounded_basic_string_sequence<charT, MAX> > reverse_iterator;
+ typedef Const_MM_Sequence_Reverse_Iterator<bounded_basic_string_sequence<charT, MAX> > const_reverse_iterator;
+
+ // Get an iterator that points to the beginning of the sequence.
+ inline iterator begin (void)
+ {
+ return iterator (&this->impl_);
+ }
+
+ // Get a const iterator that points to the beginning of the sequence.
+ inline const_iterator begin (void) const
+ {
+ return const_iterator (&this->impl_);
+ }
+
+ // Get an iterator that points to the end of the sequence.
+ inline iterator end (void)
+ {
+ return iterator (&this->impl_,
+ this->impl_.length ());
+ }
+
+ // Get a const iterator that points to the end of the sequence.
+ inline const_iterator end (void) const
+ {
+ return const_iterator (&this->impl_,
+ this->impl_.length ());
+ }
+
+ // Get a reverse iterator that points to the end of the sequence.
+ inline reverse_iterator rbegin (void)
+ {
+ return reverse_iterator (&this->impl_,
+ this->impl_.length () - 1);
+ }
+
+ // Get a const reverse iterator that points to the end of the sequence.
+ inline const_reverse_iterator rbegin (void) const
+ {
+ return const_reverse_iterator (&this->impl_,
+ this->impl_.length () - 1);
+ }
+
+ // Get a reverse iterator that points to one before the beginning
+ // of the sequence.
+ inline reverse_iterator rend (void)
+ {
+ return reverse_iterator (&this->impl_,
+ -1);
+ }
+
+ // Get a const reverse iterator that points to one before the
+ // beginning of the sequence.
+ inline const_reverse_iterator rend (void) const
+ {
+ return const_reverse_iterator (&this->impl_,
+ -1);
+ }
+
+#endif /* TAO_HAS_SEQUENCE_ITERATORS */
+
private:
implementation_type impl_;
};
diff --git a/TAO/tao/Bounded_Object_Reference_Sequence_T.h b/TAO/tao/Bounded_Object_Reference_Sequence_T.h
index 5d367a816e2..62fe5b7a562 100644
--- a/TAO/tao/Bounded_Object_Reference_Sequence_T.h
+++ b/TAO/tao/Bounded_Object_Reference_Sequence_T.h
@@ -14,6 +14,7 @@
#include "Generic_Sequence_T.h"
#include "Object_Reference_Sequence_Element_T.h"
#include "Object_Reference_Const_Sequence_Element_T.h"
+#include "tao/MM_Sequence_Iterator_T.h"
TAO_BEGIN_VERSIONED_NAMESPACE_DECL
@@ -106,6 +107,77 @@ public:
}
+#if TAO_HAS_SEQUENCE_ITERATORS
+
+ ///
+ /// Additions to support iterator semantics for TAO bounded object
+ /// reference sequences.
+ ///
+
+ // = Traits and factory methods that create iterators.
+ typedef MM_Sequence_Iterator<bounded_object_reference_sequence<object_t, object_t_var, MAX> > iterator;
+ typedef Const_MM_Sequence_Iterator<bounded_object_reference_sequence<object_t, object_t_var, MAX> > const_iterator;
+ typedef MM_Sequence_Reverse_Iterator<bounded_object_reference_sequence<object_t, object_t_var, MAX> > reverse_iterator;
+ typedef Const_MM_Sequence_Reverse_Iterator<bounded_object_reference_sequence<object_t, object_t_var, MAX> > const_reverse_iterator;
+
+ // Get an iterator that points to the beginning of the sequence.
+ iterator begin (void)
+ {
+ return iterator (&this->impl_);
+ }
+
+ // Get a const iterator that points to the beginning of the sequence.
+ const_iterator begin (void) const
+ {
+ return const_iterator (&this->impl_);
+ }
+
+ // Get an iterator that points to the end of the sequence.
+ iterator end (void)
+ {
+ return iterator (&this->impl_,
+ this->impl_.length ());
+ }
+
+ // Get a const iterator that points to the end of the sequence.
+ const_iterator end (void) const
+ {
+ return const_iterator (&this->impl_,
+ this->impl_.length ());
+ }
+
+ // Get a reverse iterator that points to the end of the sequence.
+ reverse_iterator rbegin (void)
+ {
+ return reverse_iterator (&this->impl_,
+ this->impl_.length () - 1);
+ }
+
+ // Get a const reverse iterator that points to the end of the sequence.
+ const_reverse_iterator rbegin (void) const
+ {
+ return const_reverse_iterator (&this->impl_,
+ this->impl_.length () - 1);
+ }
+
+ // Get a reverse iterator that points to one before the beginning
+ // of the sequence.
+ reverse_iterator rend (void)
+ {
+ return reverse_iterator (&this->impl_,
+ -1);
+ }
+
+ // Get a const reverse iterator that points to one before the
+ // beginning of the sequence.
+ const_reverse_iterator rend (void) const
+ {
+ return const_reverse_iterator (&this->impl_,
+ -1);
+ }
+
+#endif /* TAO_HAS_SEQUENCE_ITERATORS */
+
private:
implementation_type impl_;
};
diff --git a/TAO/tao/Generic_Sequence_T.h b/TAO/tao/Generic_Sequence_T.h
index 34b817b12ba..14d2d2433cd 100644
--- a/TAO/tao/Generic_Sequence_T.h
+++ b/TAO/tao/Generic_Sequence_T.h
@@ -68,11 +68,38 @@ namespace TAO
namespace details
{
+#if TAO_HAS_SEQUENCE_ITERATORS
+
+// Forward declare the iterators
+template<typename T>
+class Generic_Sequence_Iterator;
+
+template<typename T>
+class Const_Generic_Sequence_Iterator;
+
+template<typename T>
+class Generic_Sequence_Reverse_Iterator;
+
+template<typename T>
+class Const_Generic_Sequence_Reverse_Iterator;
+
+#endif /* TAO_HAS_SEQUENCE_ITERATORS */
+
template<typename T,
class ALLOCATION_TRAITS,
class ELEMENT_TRAITS>
class generic_sequence
{
+
+#if TAO_HAS_SEQUENCE_ITERATORS
+
+ friend class Generic_Sequence_Iterator<generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS> >;
+ friend class Const_Generic_Sequence_Iterator<generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS> >;
+ friend class Generic_Sequence_Reverse_Iterator<generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS> >;
+ friend class Const_Generic_Sequence_Reverse_Iterator<generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS> >;
+
+#endif /* TAO_HAS_SEQUENCE_ITERATORS */
+
public:
typedef T value_type;
typedef ALLOCATION_TRAITS allocation_traits;
@@ -325,6 +352,80 @@ public:
allocation_traits::freebuf(buffer);
}
+#if TAO_HAS_SEQUENCE_ITERATORS
+
+ ///
+ /// Additions to support iterator semantics for TAO sequences.
+ ///
+
+ // = Traits and factory methods that create iterators.
+ typedef Generic_Sequence_Iterator<generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS> > iterator;
+ typedef Const_Generic_Sequence_Iterator<generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS> > const_iterator;
+ typedef Generic_Sequence_Reverse_Iterator<generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS> > reverse_iterator;
+ typedef Const_Generic_Sequence_Reverse_Iterator<generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS> > const_reverse_iterator;
+
+ // Get an iterator that points to the beginning of the sequence.
+ iterator begin (void)
+ {
+ return typename generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS>::iterator (this);
+ }
+
+ // Get a const iterator that points to the beginning of the sequence.
+ const_iterator begin (void) const
+ {
+ return typename generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS>::const_iterator (this);
+ }
+
+ // Get an iterator that points to the end of the sequence.
+ iterator end (void)
+ {
+ return typename generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS>::iterator (this,
+ this->length_);
+ }
+
+ // Get a const iterator that points to the end of the sequence.
+ const_iterator end (void) const
+ {
+ return typename generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS>::const_iterator (this,
+ this->length_);
+ }
+
+ // Get a reverse iterator that points to the end of the sequence.
+ reverse_iterator rbegin (void)
+ {
+ // Here we need to be at the last element - not one past.
+ return typename generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS>::reverse_iterator (this,
+ this->length_ - 1);
+ }
+
+ // Get a const reverse iterator that points to the end of the sequence.
+ const_reverse_iterator rbegin (void) const
+ {
+ // Here we need to be at the last element - not one past.
+ return typename generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS>::const_reverse_iterator (this,
+ this->length_ - 1);
+ }
+
+ // Get a reverse iterator that points to one before the
+ // beginning of the sequence.
+ reverse_iterator rend (void)
+ {
+ // Here we need to be at one before the first element - not the first.
+ return typename generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS>::reverse_iterator (this,
+ -1);
+ }
+
+ // Get a const reverse iterator that points to one before the
+ // beginning of the sequence.
+ const_reverse_iterator rend (void) const
+ {
+ // Here we need to be at one before the first element - not the first.
+ return typename generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS>::const_reverse_iterator (this,
+ -1);
+ }
+
+#endif /* TAO_HAS_SEQUENCE_ITERATORS */
+
private:
/// The maximum number of elements the buffer can contain.
CORBA::ULong maximum_;
@@ -337,6 +438,890 @@ private:
mutable CORBA::Boolean release_;
};
+#if TAO_HAS_SEQUENCE_ITERATORS
+
+/**
+ * @class Generic_Sequence_Iterator
+ * @brief Implements a random access iterator for generic sequence type
+ * classes.
+ */
+template <typename SEQUENCE_T>
+ class Generic_Sequence_Iterator
+{
+ friend class Const_Generic_Sequence_Iterator<SEQUENCE_T>;
+
+public:
+ // = Necessary traits
+ typedef std::random_access_iterator_tag iterator_category;
+ typedef typename SEQUENCE_T::value_type value_type;
+ typedef typename SEQUENCE_T::value_type *pointer;
+ typedef typename SEQUENCE_T::value_type &reference;
+ typedef typename SEQUENCE_T::allocation_traits allocation_traits;
+ typedef typename SEQUENCE_T::element_traits element_traits;
+ typedef CORBA::Long difference_type;
+
+ /// Construct a Generic_Sequence_Iterator at position pos.
+ Generic_Sequence_Iterator (generic_sequence<value_type,
+ allocation_traits,
+ element_traits> *sequence,
+ size_t pos = 0)
+ : sequence_ (sequence),
+ pos_ (pos)
+ {
+ }
+
+ /// Copy constructor
+ Generic_Sequence_Iterator (Generic_Sequence_Iterator<SEQUENCE_T> const & rhs)
+ : sequence_ (rhs.sequence_),
+ pos_ (rhs.pos_)
+ {
+ }
+
+ /// Assignment operator
+ Generic_Sequence_Iterator & operator= (
+ Generic_Sequence_Iterator<SEQUENCE_T> const & rhs)
+ {
+ Generic_Sequence_Iterator tmp(rhs);
+ swap (tmp);
+ return * this;
+ }
+
+ /// swaps all members
+ void swap(Generic_Sequence_Iterator<SEQUENCE_T> & rhs)
+ throw()
+ {
+ std::swap (sequence_, rhs.sequence_);
+ std::swap (this->pos_, rhs.pos_);
+ }
+
+ /// typecast operator to Const_Generic_Sequence_Iterator
+ operator Const_Generic_Sequence_Iterator<SEQUENCE_T> ()
+ {
+ return Const_Generic_Sequence_Iterator<SEQUENCE_T> (*this);
+ }
+
+ /// Dereference operator returns a reference to the item contained
+ /// at the current position
+ value_type & operator* (void)
+ {
+ // Access the underlying element in the sequence.
+ return (*(this->sequence_))[this->pos_];
+ }
+
+ /// Returns a const reference to the item contained at the current position
+ const value_type & operator* (void) const
+ {
+ // Access the underlying element in the sequence.
+ return (*(this->sequence_))[this->pos_];
+ }
+
+ /// Preincrement operator
+ Generic_Sequence_Iterator<SEQUENCE_T> &operator++ (void)
+ {
+ // Increment the position.
+ // We also need to check if we're now past the end.
+ ++this->pos_;
+ return *this;
+ }
+
+ /// Postincrement operator
+ Generic_Sequence_Iterator<SEQUENCE_T> operator++ (int)
+ {
+ // Create a temporary to return so that it's not modified.
+ Generic_Sequence_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
+ // Increment the position.
+ // We also need to check if we're now past the end.
+ ++this->pos_;
+ return temp_iter;
+ }
+
+ /// Predecrement operator
+ Generic_Sequence_Iterator<SEQUENCE_T> &operator-- (void)
+ {
+ --this->pos_;
+ return *this;
+ }
+
+ /// Postdecrement operator
+ Generic_Sequence_Iterator<SEQUENCE_T> operator-- (int)
+ {
+ // Create a temporary to return so that it's not modified.
+ Generic_Sequence_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
+ --this->pos_;
+ return temp_iter;
+ }
+
+ /// Iterator addition
+ Generic_Sequence_Iterator<SEQUENCE_T> &operator+= (difference_type n)
+ {
+ // Move ahead n elements.
+ this->pos_ += n;
+ return *this;
+ }
+
+ /// Iterator addition
+ Generic_Sequence_Iterator<SEQUENCE_T> operator+ (difference_type n)
+ {
+ // Create a temporary to return and move it ahead n elements.
+ return Generic_Sequence_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ + n);
+ }
+
+ /// Iterator subtraction
+ Generic_Sequence_Iterator<SEQUENCE_T> &operator-= (difference_type n)
+ {
+ // Move back n elements.
+ this->pos_ -= n;
+ return *this;
+ }
+
+ /// Iterator subtraction
+ Generic_Sequence_Iterator<SEQUENCE_T> operator- (difference_type n)
+ {
+ // Create a temporary to return and move it back n elements.
+ return Generic_Sequence_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ - n);
+ }
+
+ /// Difference
+ difference_type operator- (const Generic_Sequence_Iterator<SEQUENCE_T> & rhs)
+ {
+ // I think order is important here (i.e., rhs before this).
+ return this->pos_ - rhs.pos_;
+ }
+
+ /// Difference
+ difference_type operator- (const Const_Generic_Sequence_Iterator<SEQUENCE_T> & rhs)
+ {
+ // I think order is important here (i.e., rhs before this).
+ return this->pos_ - rhs.pos_;
+ }
+
+
+ /// Element operator/assignment
+ value_type & operator[] (difference_type n)
+ {
+ // Return the element at position n
+ return (*(this->sequence_))[this->pos_ + n];
+ }
+
+ /// Less than
+ bool operator< (const Generic_Sequence_Iterator<SEQUENCE_T> & rhs)
+ {
+ // Return if this iterator is less than the passed in iterator.
+ return this->pos_ < rhs.pos_;
+ }
+
+ /// Less than
+ bool operator< (const Const_Generic_Sequence_Iterator<SEQUENCE_T> & rhs)
+ {
+ // Return if this iterator is less than the passed in iterator.
+ return this->pos_ < rhs.pos_;
+ }
+
+
+ /// Equality operator
+ bool operator== (const Generic_Sequence_Iterator<SEQUENCE_T> &rhs) const
+ {
+ // Compare all the data members for equality.
+ return this->sequence_ == rhs.sequence_
+ && this->pos_ == rhs.pos_;
+ }
+
+ /// Nonequality operator
+ bool operator!= (const Generic_Sequence_Iterator<SEQUENCE_T> &rhs) const
+ {
+ return !(*this == rhs);
+ }
+
+private:
+ /// the sequence with which we are dealing
+ generic_sequence<value_type, allocation_traits, element_traits> *sequence_;
+
+ /// Our current position in the sequence.
+ mutable difference_type pos_;
+};
+
+
+/// Iterator addition with the difference_type being the first argument.
+template<typename SEQUENCE_T>
+ Generic_Sequence_Iterator<SEQUENCE_T>
+ operator+ (typename Generic_Sequence_Iterator<SEQUENCE_T>::difference_type n,
+ const Generic_Sequence_Iterator<SEQUENCE_T> & iter)
+ {
+ // Create an iter and move it ahead n elements.
+ return Generic_Sequence_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ + n);
+ }
+
+/// Iterator subtraction with the difference_type being the first argument.
+template<typename SEQUENCE_T>
+ Generic_Sequence_Iterator<SEQUENCE_T> operator-
+ (typename Generic_Sequence_Iterator<SEQUENCE_T>::difference_type n,
+ Generic_Sequence_Iterator<SEQUENCE_T> iter)
+ {
+ // Create an iter and move it back n elements.
+ return Generic_Sequence_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ - n);
+ }
+
+
+/**
+ * @class Const_Generic_Sequence_Iterator
+ * @brief Implements a constant random access iterator for generic sequence
+ * type classes.
+ *
+ * Note: Having a const Iterator does not guarantee that the current
+ * *position* that it points to will not change, it only guarantees that
+ * you cannot change the underlying array!
+ */
+template <typename SEQUENCE_T>
+class Const_Generic_Sequence_Iterator
+{
+ friend class Generic_Sequence_Iterator<SEQUENCE_T>;
+
+public:
+ // = Necessary traits
+ typedef std::random_access_iterator_tag iterator_category;
+ typedef typename SEQUENCE_T::value_type value_type;
+ typedef typename SEQUENCE_T::value_type *pointer;
+ typedef typename SEQUENCE_T::value_type &reference;
+ typedef typename SEQUENCE_T::allocation_traits allocation_traits;
+ typedef typename SEQUENCE_T::element_traits element_traits;
+ typedef int difference_type;
+
+ /// Construct a Const_Generic_Sequence_Iterator at position pos from
+ /// a const sequence.
+ Const_Generic_Sequence_Iterator (const generic_sequence<value_type,
+ allocation_traits,
+ element_traits> *sequence,
+ size_t pos = 0)
+ : sequence_ (sequence),
+ pos_ (pos)
+ {
+ }
+
+ virtual ~Const_Generic_Sequence_Iterator ()
+ {
+ }
+
+ /// Copy constructor
+ Const_Generic_Sequence_Iterator (
+ Const_Generic_Sequence_Iterator<SEQUENCE_T> const & rhs)
+ : sequence_ (rhs.sequence_),
+ pos_ (rhs.pos_)
+ {
+ }
+
+ /// Copy constructor initializing by a Generic_Sequence_Iterator
+ Const_Generic_Sequence_Iterator (
+ Generic_Sequence_Iterator<SEQUENCE_T> const & rhs)
+ : sequence_ (rhs.sequence_),
+ pos_ (rhs.pos_)
+ {
+ }
+
+ /// Assignment operator
+ Const_Generic_Sequence_Iterator & operator= (
+ Const_Generic_Sequence_Iterator<SEQUENCE_T> const & rhs)
+ {
+ Const_Generic_Sequence_Iterator tmp(rhs);
+ swap (tmp);
+ return * this;
+ }
+
+ /// swaps all members
+ void swap(Const_Generic_Sequence_Iterator<SEQUENCE_T> & rhs)
+ throw()
+ {
+ std::swap (sequence_, rhs.sequence_);
+ std::swap (this->pos_, rhs.pos_);
+ }
+
+ /// Dereference operator returns a reference to the item contained
+ /// at the current position
+ const value_type & operator* (void) const
+ {
+ // Access the underlying element in the sequence.
+ return (*(this->sequence_))[this->pos_];
+ }
+
+ /// Preincrement operator
+ const Const_Generic_Sequence_Iterator<SEQUENCE_T> &operator++ (void) const
+ {
+ // Increment the position.
+ // We also need to check if we're now past the end.
+ ++this->pos_;
+ return * this;
+ }
+
+ /// Postincrement operator
+ Const_Generic_Sequence_Iterator<SEQUENCE_T> operator++ (int) const
+ {
+ // Create a temporary to return so that it's not modified.
+ Const_Generic_Sequence_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
+ // Increment the position.
+ // We also need to check if we're now past the end.
+ ++this->pos_;
+ return temp_iter;
+ }
+
+ /// Predecrement operator
+ const Const_Generic_Sequence_Iterator<SEQUENCE_T> &operator-- (void) const
+ {
+ --this->pos_;
+ return * this;
+ }
+
+ /// Postdecrement operator
+ Const_Generic_Sequence_Iterator<SEQUENCE_T> operator-- (int) const
+ {
+ // Create a temporary to return so that it's not modified.
+ Const_Generic_Sequence_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
+ --this->pos_;
+ return temp_iter;
+ }
+
+ /// Iterator addition
+ const Const_Generic_Sequence_Iterator<SEQUENCE_T> &operator+= (difference_type n) const
+ {
+ // Move ahead n elements.
+ this->pos_ += n;
+ return * this;
+ }
+
+ /// Iterator addition
+ Const_Generic_Sequence_Iterator<SEQUENCE_T> operator+ (difference_type n) const
+ {
+ // Create a temporary to return and move it ahead n elements.
+ return Const_Generic_Sequence_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ + n);
+ }
+
+ /// Iterator subtraction
+ const Const_Generic_Sequence_Iterator<SEQUENCE_T> &operator-= (difference_type n) const
+ {
+ // Move back n elements.
+ this->pos_ -= n;
+ return * this;
+ }
+
+ /// Iterator subtraction
+ Const_Generic_Sequence_Iterator<SEQUENCE_T> operator- (difference_type n) const
+ {
+ // Create a temporary to return and move it back n elements.
+ return Const_Generic_Sequence_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ - n);
+ }
+
+ /// Difference
+ difference_type operator- (const Const_Generic_Sequence_Iterator<SEQUENCE_T> & rhs) const
+ {
+ // I think the order is important here (i.e., rhs before this).
+ return this->pos_ - rhs.pos_;
+ }
+
+ /// Element operator/assignment
+ const value_type & operator[] (difference_type n) const
+ {
+ // Return the element at position n
+ return (*(this->sequence_))[this->pos_ + n];
+ }
+
+ /// Less than
+ virtual bool operator< (const Const_Generic_Sequence_Iterator<SEQUENCE_T> & rhs) const
+ {
+ // Return if this iterator is less than the passed in iterator.
+ return this->pos_ < rhs.pos_;
+ }
+
+ /// Equality operator
+ bool operator== (const Const_Generic_Sequence_Iterator<SEQUENCE_T> &rhs) const
+ {
+ // Compare all the data members for equality.
+ return this->sequence_ == rhs.sequence_
+ && this->pos_ == rhs.pos_;
+ }
+
+ /// Nonequality operator
+ bool operator!= (const Const_Generic_Sequence_Iterator<SEQUENCE_T> &rhs) const
+ {
+ return !(*this == rhs);
+ }
+
+private:
+ /// the array we are dealing with
+ const generic_sequence<value_type, allocation_traits, element_traits> *sequence_;
+
+ /// Our current position in the sequence.
+ mutable difference_type pos_;
+};
+
+/// Iterator addition with the difference_type being the first argument.
+template<typename SEQUENCE_T>
+ Const_Generic_Sequence_Iterator<SEQUENCE_T> operator+
+ (typename Generic_Sequence_Iterator<SEQUENCE_T>::difference_type n,
+ Const_Generic_Sequence_Iterator<SEQUENCE_T> iter)
+ {
+ // Create an iter and move it ahead n elements.
+ return Const_Generic_Sequence_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ + n);
+ }
+
+/// Iterator subtraction with the difference_type being the first argument.
+template<typename SEQUENCE_T>
+ Const_Generic_Sequence_Iterator<SEQUENCE_T> operator-
+ (typename Generic_Sequence_Iterator<SEQUENCE_T>::difference_type n,
+ Const_Generic_Sequence_Iterator<SEQUENCE_T> iter)
+ {
+ // Create an iter and move it back n elements.
+ return Const_Generic_Sequence_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ - n);
+ }
+
+
+/**
+ * @class Generic_Sequence_Reverse_Iterator
+ * @brief Implements a reverse random access iterator for generic sequence
+ * type classes.
+ */
+template <typename SEQUENCE_T>
+class Generic_Sequence_Reverse_Iterator
+{
+ friend class Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T>;
+
+public:
+ // = Necessary traits
+ typedef std::random_access_iterator_tag iterator_category;
+ typedef typename SEQUENCE_T::value_type value_type;
+ typedef typename SEQUENCE_T::value_type *pointer;
+ typedef typename SEQUENCE_T::value_type &reference;
+ typedef typename SEQUENCE_T::allocation_traits allocation_traits;
+ typedef typename SEQUENCE_T::element_traits element_traits;
+ typedef int difference_type;
+
+ /// Construct a Generic_Sequence_Reverse_Iterator at position pos with before_start flag.
+ Generic_Sequence_Reverse_Iterator (generic_sequence<value_type,
+ allocation_traits,
+ element_traits> *sequence,
+ size_t pos)
+ : sequence_ (sequence),
+ pos_ (pos)
+ {
+ }
+
+ /// Copy constructor
+ Generic_Sequence_Reverse_Iterator (
+ Generic_Sequence_Reverse_Iterator<SEQUENCE_T> const & rhs)
+ : sequence_ (rhs.sequence_),
+ pos_ (rhs.pos_)
+ {
+ }
+
+ /// Assignment operator
+ Generic_Sequence_Reverse_Iterator & operator= (
+ Generic_Sequence_Reverse_Iterator<SEQUENCE_T> const & rhs)
+ {
+ Generic_Sequence_Reverse_Iterator tmp(rhs);
+ swap (tmp);
+ return * this;
+ }
+
+ /// swaps all members
+ void swap(Generic_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs)
+ throw()
+ {
+ std::swap (sequence_, rhs.sequence_);
+ std::swap (this->pos_, rhs.pos_);
+ }
+
+ /// Dereference operator returns a reference to the item contained
+ /// at the current position
+ value_type & operator* (void)
+ {
+ // Access the underlying element in the sequence.
+ return (*(this->sequence_))[this->pos_];
+ }
+
+ /// Returns a const reference to the item contained at the current position
+ const value_type& operator* (void) const
+ {
+ // Access the underlying element in the sequence.
+ return (*(this->sequence_))[this->pos_];
+ }
+
+ /// Preincrement operator
+ Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &operator++ (void)
+ {
+ // Decrement the position for reverse iterators.
+ // We also need to check if we're now before the start.
+ --this->pos_;
+ return *this;
+ }
+
+ /// Postincrement operator
+ Generic_Sequence_Reverse_Iterator<SEQUENCE_T> operator++ (int)
+ {
+ // Create a temporary to return so that it's not modified.
+ Generic_Sequence_Reverse_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
+ // Decrement the position for reverse iterators.
+ // We also need to check if we're now past the end.
+ --this->pos_;
+ return temp_iter;
+ }
+
+ /// Predecrement operator
+ Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &operator-- (void)
+ {
+ // Increment the position for reverse iterators.
+ ++this->pos_;
+ return *this;
+ }
+
+ /// Postdecrement operator
+ Generic_Sequence_Reverse_Iterator<SEQUENCE_T> operator-- (int)
+ {
+ // Create a temporary to return so that it's not modified.
+ Generic_Sequence_Reverse_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
+ // Increment the position for reverse iterators.
+ ++this->pos_;
+ return temp_iter;
+ }
+
+ /// Iterator addition
+ Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &operator+= (difference_type n)
+ {
+ // Move back n elements for reverse iterators.
+ this->pos_ -= n;
+ return *this;
+ }
+
+ /// Iterator addition
+ Generic_Sequence_Reverse_Iterator<SEQUENCE_T> operator+ (difference_type n)
+ {
+ // Create a temporary to return and move it back n elements for
+ // reverse iterators.
+ return Generic_Sequence_Reverse_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ - n);
+ }
+
+ /// Iterator subtraction
+ Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &operator-= (difference_type n)
+ {
+ // Move ahead n elements for reverse iterators.
+ this->pos_ += n;
+ return *this;
+ }
+
+ /// Iterator subtraction
+ Generic_Sequence_Reverse_Iterator<SEQUENCE_T> operator- (difference_type n)
+ {
+ // Create a temporary to return and move it ahead n elements for
+ // reverse iterators.
+ return Generic_Sequence_Reverse_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ + n);
+ }
+
+ /// Difference
+ difference_type operator- (const Generic_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs)
+ {
+ // I think order is important here (i.e., rhs before this).
+ return rhs.pos_ - this->pos_;
+ }
+
+ /// Difference
+ difference_type operator- (const Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs)
+ {
+ // I think order is important here (i.e., rhs before this).
+ return rhs.pos_ - this->pos_;
+ }
+
+
+ /// Element operator/assignment
+ value_type & operator[] (difference_type n)
+ {
+ // Return the element at position n
+ return (*(this->sequence_))[this->pos_ - n];
+ }
+
+ /// Less than
+ bool operator< (const Generic_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs)
+ {
+ // Return if this iterator is less than the passed in iterator.
+ // For reverse iterators reverse the logic.
+ return this->pos_ > rhs.pos_;
+ }
+
+ /// Less than
+ bool operator< (const Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs)
+ {
+ // Return if this iterator is less than the passed in iterator.
+ // For reverse iterators reverse the logic.
+ return this->pos_ > rhs.pos_;
+ }
+
+
+ /// Equality operator
+ bool operator== (const Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &rhs) const
+ {
+ // Compare all the data members for equality.
+ return this->sequence_ == rhs.sequence_
+ && this->pos_ == rhs.pos_;
+ }
+
+ /// Equality operator
+ bool operator== (const Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &rhs) const
+ {
+ // Compare all the data members for equality.
+ return this->sequence_ == rhs.sequence_
+ && this->pos_ == rhs.pos_;
+ }
+
+ /// Nonequality operator
+ bool operator!= (const Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &rhs) const
+ {
+ return !(*this == rhs);
+ }
+
+ /// Nonequality operator
+ bool operator!= (const Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &rhs) const
+ {
+ return !(*this == rhs);
+ }
+
+private:
+ /// The sequence with which we are dealing
+ generic_sequence<value_type, allocation_traits, element_traits> *sequence_;
+
+ /// Our current position in the sequence.
+ mutable difference_type pos_;
+};
+
+/// Iterator addition with the difference_type being the first argument.
+template<typename SEQUENCE_T>
+ Generic_Sequence_Reverse_Iterator<SEQUENCE_T> operator+
+ (typename Generic_Sequence_Reverse_Iterator<SEQUENCE_T>::difference_type n,
+ Generic_Sequence_Reverse_Iterator<SEQUENCE_T> iter)
+ {
+ // Create an iter and move it back n elements for reverse iterators.
+ return Generic_Sequence_Reverse_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ - n);
+ }
+
+/// Iterator subtraction with the difference_type being the first argument.
+template<typename SEQUENCE_T>
+ Generic_Sequence_Reverse_Iterator<SEQUENCE_T> operator-
+ (typename Generic_Sequence_Reverse_Iterator<SEQUENCE_T>::difference_type n,
+ Generic_Sequence_Reverse_Iterator<SEQUENCE_T> iter)
+ {
+ // Create an iter and move it ahead n elements for reverse iterators.
+ return Generic_Sequence_Reverse_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ + n);
+ }
+
+
+/**
+ * @class Const_Generic_Sequence_Reverse_Iterator
+ * @brief Implements a constant reverse random access iterator for generic
+ * sequence type classes.
+ *
+ * Note: Having a const Iterator does not guarantee that the current
+ * *position* that it points to will not change, it only guarantees that
+ * you cannot change the underlying array!
+ */
+template <typename SEQUENCE_T>
+class Const_Generic_Sequence_Reverse_Iterator
+{
+ friend class Generic_Sequence_Reverse_Iterator<SEQUENCE_T>;
+
+public:
+ // = Necessary traits
+ typedef std::random_access_iterator_tag iterator_category;
+ typedef typename SEQUENCE_T::value_type value_type;
+ typedef typename SEQUENCE_T::value_type *pointer;
+ typedef typename SEQUENCE_T::value_type &reference;
+ typedef typename SEQUENCE_T::allocation_traits allocation_traits;
+ typedef typename SEQUENCE_T::element_traits element_traits;
+ typedef int difference_type;
+
+ /// Construct a Const_Generic_Sequence_Reverse_Iterator at position pos
+ /// using a const sequence.
+ Const_Generic_Sequence_Reverse_Iterator (const generic_sequence<value_type,
+ allocation_traits,
+ element_traits> *sequence,
+ size_t pos)
+ : sequence_ (sequence),
+ pos_ (pos)
+ {
+ }
+
+ /// Copy constructor
+ Const_Generic_Sequence_Reverse_Iterator (
+ Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> const & rhs)
+ : sequence_ (rhs.sequence_),
+ pos_ (rhs.pos_)
+ {
+ }
+
+ /// Copy constructor
+ Const_Generic_Sequence_Reverse_Iterator (
+ Generic_Sequence_Reverse_Iterator<SEQUENCE_T> const & rhs)
+ : sequence_ (rhs.sequence_),
+ pos_ (rhs.pos_)
+ {
+ }
+
+ /// Assignment operator
+ Const_Generic_Sequence_Reverse_Iterator & operator= (
+ Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> const & rhs)
+ {
+ Const_Generic_Sequence_Reverse_Iterator tmp(rhs);
+ swap (tmp);
+ return * this;
+ }
+
+ /// swaps all members
+ void swap(Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs)
+ throw()
+ {
+ std::swap (sequence_, rhs.sequence_);
+ std::swap (this->pos_, rhs.pos_);
+ }
+
+ /// typecast operator to Generic_Sequence_Reverse_Iterator
+
+ /// Dereference operator returns a reference to the item contained
+ /// at the current position
+ const value_type& operator* (void) const
+ {
+ // Access the underlying element in the sequence.
+ return (*this->sequence_)[this->pos_];
+ }
+
+ /// Preincrement operator
+ const Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &operator++ (void) const
+ {
+ // Decrement the position for reveres iterators.
+ // We also need to check if we're now before the start.
+ --this->pos_;
+ return *this;
+ }
+
+ /// Postincrement operator
+ Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> operator++ (int) const
+ {
+ // Create a temporary to return so that it's not modified.
+ Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
+ // Decrement the position for reverse iterators.
+ // We also need to check if we're now before the start.
+ --this->pos_;
+ return temp_iter;
+ }
+
+ /// Predecrement operator
+ const Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &operator-- (void) const
+ {
+ // Increment the position for reverse iterators.
+ ++this->pos_;
+ return *this;
+ }
+
+ /// Postdecrement operator
+ Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> operator-- (int) const
+ {
+ // Create a temporary to return so that it's not modified.
+ Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
+ // Increment the position for reverse iterators.
+ ++this->pos_;
+ return temp_iter;
+ }
+
+ /// Iterator addition
+ const Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &operator+= (difference_type n) const
+ {
+ // Move back n elements for reverse iterators.
+ this->pos_ -= n;
+ return *this;
+ }
+
+ /// Iterator addition
+ Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> operator+ (difference_type n) const
+ {
+ // Create a temporary to return and move it back n elements for
+ // reverse iterators.
+ return Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ - n);
+ }
+
+ /// Iterator subtraction
+ const Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &operator-= (difference_type n) const
+ {
+ // Move ahead n elements for reverse iterators.
+ this->pos_ += n;
+ return *this;
+ }
+
+ /// Iterator subtraction
+ Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> operator- (difference_type n) const
+ {
+ // Create a temporary to return and move it ahead n elements for
+ // reverse iterators.
+ return Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ + n);
+ }
+
+ /// Difference
+ difference_type operator- (const Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs) const
+ {
+ // I think order is important here (i.e., rhs before this).
+ return rhs.pos_ - this->pos_;
+ }
+
+ /// Element operator/assignment
+ const value_type & operator[] (difference_type n) const
+ {
+ // Return the element at position n
+ return (*(this->sequence_))[this->pos_ - n];
+ }
+
+ /// Less than
+ bool operator< (const Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs) const
+ {
+ // Return if this iterator is less than the passed in iterator.
+ // For reverse iterators reverse the logic.
+ return this->pos_ > rhs.pos_;
+ }
+
+ /// Equality operator
+ bool operator== (const Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &rhs) const
+ {
+ // Compare all the data members for equality.
+ return this->sequence_ == rhs.sequence_
+ && this->pos_ == rhs.pos_;
+ }
+
+ /// Nonequality operator
+ bool operator!= (const Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &rhs) const
+ {
+ return !(*this == rhs);
+ }
+
+private:
+ /// the array we are dealing with
+ const generic_sequence<value_type, allocation_traits, element_traits> *sequence_;
+
+ /// Our current position in the sequence.
+ mutable difference_type pos_;
+};
+
+/// Iterator addition with the difference_type being the first argument.
+template<typename SEQUENCE_T>
+ Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> operator+
+ (typename Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T>::difference_type n,
+ Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> iter)
+ {
+ // Create an iter and move it back n elements for reverse iterators.
+ return Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ - n);
+ }
+
+/// Iterator subtraction with the difference_type being the first argument.
+template<typename SEQUENCE_T>
+ Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> operator-
+ (typename Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T>::difference_type n,
+ Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> iter)
+ {
+ // Create an iter and move it ahead n elements for reverse iterators.
+ return Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ + n);
+ }
+
+#endif /* TAO_HAS_SEQUENCE_ITERATORS */
+
} // namespace details
} // namespace TAO
diff --git a/TAO/tao/MM_Sequence_Iterator_T.h b/TAO/tao/MM_Sequence_Iterator_T.h
new file mode 100644
index 00000000000..186889f7033
--- /dev/null
+++ b/TAO/tao/MM_Sequence_Iterator_T.h
@@ -0,0 +1,959 @@
+#ifndef mm_sequence_iterator_h
+#define mm_sequence_iterator_h
+
+/**
+ * @file
+ *
+ * @brief Implement the iterator for CORBA sequences that need
+ * memory management.
+ *
+ * There are some CORBA sequences that need to manage memory (e.g.,
+ * string sequences). Iterators for these classes also need to
+ * manage memory and therefore do not use the iterators defined
+ * for the generic sequences.
+ *
+ * Essentially, only the iterators operators that reference and return
+ * elements (e.g.,operator*, operator[]) need to be overridden from the
+ * behavior provided by the generic sequence iterators. Template
+ * specialization code is appropriate here but I couldn't figure out how
+ * to make the compiler happy.
+ *
+ * In lieu of template specialization code separate iterators exist
+ * for sequences that manage memory. Here are those iterators.
+ *
+ * $Id$
+ *
+ * @author Joe Hoffert
+ */
+
+#if TAO_HAS_SEQUENCE_ITERATORS
+
+namespace TAO
+{
+
+// Forward declare the iterators
+template<typename T>
+class MM_Sequence_Iterator;
+
+template<typename T>
+class Const_MM_Sequence_Iterator;
+
+template<typename T>
+class MM_Sequence_Reverse_Iterator;
+
+template<typename T>
+class Const_MM_Sequence_Reverse_Iterator;
+
+
+/**
+ * @class MM_Sequence_Iterator
+ * @brief Implements a random access iterator for generic sequence type
+ * classes that need to manage memory. MM stands for memory managed.
+ */
+template <typename SEQUENCE_T>
+ class MM_Sequence_Iterator
+{
+ friend class Const_MM_Sequence_Iterator<SEQUENCE_T>;
+
+public:
+ // = Necessary traits
+ typedef std::random_access_iterator_tag iterator_category;
+ typedef typename SEQUENCE_T::value_type value_type;
+ typedef typename SEQUENCE_T::value_type *pointer;
+ typedef typename SEQUENCE_T::value_type &reference;
+ typedef typename SEQUENCE_T::element_type element_type;
+ typedef typename SEQUENCE_T::const_element_type const_element_type;
+ typedef typename SEQUENCE_T::allocation_traits allocation_traits;
+ typedef typename SEQUENCE_T::element_traits element_traits;
+ typedef typename SEQUENCE_T::implementation_type implementation_type;
+ typedef CORBA::Long difference_type;
+
+ /// Construct a MM_Sequence_Iterator at position pos.
+ MM_Sequence_Iterator (implementation_type *sequence,
+ size_t pos = 0)
+ : sequence_ (sequence),
+ pos_ (pos)
+ {
+ }
+
+ /// Copy constructor
+ MM_Sequence_Iterator (MM_Sequence_Iterator<SEQUENCE_T> const & rhs)
+ : sequence_ (rhs.sequence_),
+ pos_ (rhs.pos_)
+ {
+ }
+
+ /// Assignment operator
+ MM_Sequence_Iterator & operator= (MM_Sequence_Iterator<SEQUENCE_T> const & rhs)
+ {
+ MM_Sequence_Iterator tmp(rhs);
+ swap (tmp);
+ return * this;
+ }
+
+ /// swaps all members
+ void swap(MM_Sequence_Iterator<SEQUENCE_T> & rhs)
+ throw()
+ {
+ std::swap (sequence_, rhs.sequence_);
+ std::swap (this->pos_, rhs.pos_);
+ }
+
+ /// typecast operator to Const_MM_Sequence_Iterator
+ operator Const_MM_Sequence_Iterator<SEQUENCE_T> ()
+ {
+ return Const_MM_Sequence_Iterator<SEQUENCE_T> (*this);
+ }
+
+ /// Dereference operator returns a reference to the item contained
+ /// at the current position
+ element_type operator* (void)
+ {
+ // Access the underlying element in the sequence.
+ return element_type ((*(this->sequence_))[this->pos_],
+ this->sequence_->release ());
+ }
+
+ /// Returns a const reference to the item contained at the current position
+ const_element_type operator* (void) const
+ {
+ // Access the underlying element in the sequence.
+ return const_element_type ((*(this->sequence_))[this->pos_],
+ this->sequence_->release ());
+ }
+
+ /// Preincrement operator
+ MM_Sequence_Iterator<SEQUENCE_T> &operator++ (void)
+ {
+ // Increment the position.
+ // We also need to check if we're now past the end.
+ ++this->pos_;
+ return *this;
+ }
+
+ /// Postincrement operator
+ MM_Sequence_Iterator<SEQUENCE_T> operator++ (int)
+ {
+ // Create a temporary to return so that it's not modified.
+ MM_Sequence_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
+ // Increment the position.
+ // We also need to check if we're now past the end.
+ ++this->pos_;
+ return temp_iter;
+ }
+
+ /// Predecrement operator
+ MM_Sequence_Iterator<SEQUENCE_T> &operator-- (void)
+ {
+ --this->pos_;
+ return *this;
+ }
+
+ /// Postdecrement operator
+ MM_Sequence_Iterator<SEQUENCE_T> operator-- (int)
+ {
+ // Create a temporary to return so that it's not modified.
+ MM_Sequence_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
+ --this->pos_;
+ return temp_iter;
+ }
+
+ /// Iterator addition
+ MM_Sequence_Iterator<SEQUENCE_T> &operator+= (difference_type n)
+ {
+ // Move ahead n elements.
+ this->pos_ += n;
+ return *this;
+ }
+
+ /// Iterator addition
+ MM_Sequence_Iterator<SEQUENCE_T> operator+ (difference_type n)
+ {
+ // Create a temporary to return and move it ahead n elements.
+ return MM_Sequence_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ + n);
+ }
+
+ /// Iterator subtraction
+ MM_Sequence_Iterator<SEQUENCE_T> &operator-= (difference_type n)
+ {
+ // Move back n elements.
+ this->pos_ -= n;
+ return *this;
+ }
+
+ /// Iterator subtraction
+ MM_Sequence_Iterator<SEQUENCE_T> operator- (difference_type n)
+ {
+ // Create a temporary to return and move it back n elements.
+ return MM_Sequence_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ - n);
+ }
+
+ /// Difference
+ difference_type operator- (const MM_Sequence_Iterator<SEQUENCE_T> & rhs)
+ {
+ // I think order is important here (i.e., this before rhs).
+ return this->pos_ - rhs.pos_;
+ }
+
+ /// Difference
+ difference_type operator- (const Const_MM_Sequence_Iterator<SEQUENCE_T> & rhs)
+ {
+ // I think order is important here (i.e., this before rhs).
+ return this->pos_ - rhs.pos_;
+ }
+
+ /// Element operator/assignment
+ element_type operator[] (difference_type n)
+ {
+ // Return the element at position pos_ + n
+ return element_type ((*(this->sequence_))[this->pos_ + n],
+ this->sequence_->release ());
+ }
+
+ /// Element operator/assignment
+ const_element_type operator[] (difference_type n) const
+ {
+ // Return the element at position pos_ + n
+ return const_element_type ((*(this->sequence_))[this->pos_ + n],
+ this->sequence_->release ());
+ }
+
+ /// Less than
+ bool operator< (const MM_Sequence_Iterator<SEQUENCE_T> & rhs)
+ {
+ // Return if this iterator is less than the passed in iterator.
+ return this->pos_ < rhs.pos_;
+ }
+
+ /// Less than
+ bool operator< (const Const_MM_Sequence_Iterator<SEQUENCE_T> & rhs)
+ {
+ // Return if this iterator is less than the passed in iterator.
+ return this->pos_ < rhs.pos_;
+ }
+
+
+ /// Equality operator
+ bool operator== (const MM_Sequence_Iterator<SEQUENCE_T> &rhs) const
+ {
+ // Compare all the data members for equality.
+ return this->sequence_ == rhs.sequence_
+ && this->pos_ == rhs.pos_;
+ }
+
+ /// Nonequality operator
+ bool operator!= (const MM_Sequence_Iterator<SEQUENCE_T> &rhs) const
+ {
+ return !(*this == rhs);
+ }
+
+private:
+ /// the sequence with which we are dealing
+ implementation_type *sequence_;
+
+ /// Our current position in the sequence.
+ mutable difference_type pos_;
+};
+
+
+/// Iterator addition with the difference_type being the first argument.
+template<typename SEQUENCE_T>
+ MM_Sequence_Iterator<SEQUENCE_T>
+ operator+ (typename MM_Sequence_Iterator<SEQUENCE_T>::difference_type n,
+ const MM_Sequence_Iterator<SEQUENCE_T> & iter)
+ {
+ // Create an iter and move it ahead n elements.
+ return MM_Sequence_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ + n);
+ }
+
+/// Iterator subtraction with the difference_type being the first argument.
+template<typename SEQUENCE_T>
+ MM_Sequence_Iterator<SEQUENCE_T> operator-
+ (typename MM_Sequence_Iterator<SEQUENCE_T>::difference_type n,
+ MM_Sequence_Iterator<SEQUENCE_T> iter)
+ {
+ // Create an iter and move it back n elements.
+ return MM_Sequence_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ - n);
+ }
+
+
+/**
+ * @class Const_MM_Sequence_Iterator
+ * @brief Implements a constant random access iterator for generic sequence
+ * type classes that need to manage memory. MM stands for memory
+ * managed.
+ *
+ * Note: Having a const Iterator does not guarantee that the current
+ * *position* that it points to will not change, it only guarantees that
+ * you cannot change the underlying array!
+ */
+template <typename SEQUENCE_T>
+class Const_MM_Sequence_Iterator
+{
+ friend class MM_Sequence_Iterator<SEQUENCE_T>;
+
+public:
+ // = Necessary traits
+ typedef std::random_access_iterator_tag iterator_category;
+ typedef typename SEQUENCE_T::value_type value_type;
+ typedef typename SEQUENCE_T::value_type *pointer;
+ typedef typename SEQUENCE_T::value_type &reference;
+ typedef typename SEQUENCE_T::const_element_type const_element_type;
+ typedef typename SEQUENCE_T::allocation_traits allocation_traits;
+ typedef typename SEQUENCE_T::element_traits element_traits;
+ typedef typename SEQUENCE_T::implementation_type implementation_type;
+ typedef int difference_type;
+
+ /// Construct a Const_MM_Sequence_Iterator at position pos from
+ /// a const sequence.
+ Const_MM_Sequence_Iterator (const implementation_type *sequence,
+ size_t pos = 0)
+ : sequence_ (sequence),
+ pos_ (pos)
+ {
+ }
+
+ virtual ~Const_MM_Sequence_Iterator ()
+ {
+ }
+
+ /// Copy constructor
+ Const_MM_Sequence_Iterator (
+ Const_MM_Sequence_Iterator<SEQUENCE_T> const & rhs)
+ : sequence_ (rhs.sequence_),
+ pos_ (rhs.pos_)
+ {
+ }
+
+ /// Copy constructor initializing by a MM_Sequence_Iterator
+ Const_MM_Sequence_Iterator (
+ MM_Sequence_Iterator<SEQUENCE_T> const & rhs)
+ : sequence_ (rhs.sequence_),
+ pos_ (rhs.pos_)
+ {
+ }
+
+ /// Assignment operator
+ Const_MM_Sequence_Iterator & operator= (
+ Const_MM_Sequence_Iterator<SEQUENCE_T> const & rhs)
+ {
+ Const_MM_Sequence_Iterator tmp(rhs);
+ swap (tmp);
+ return * this;
+ }
+
+ /// swaps all members
+ void swap(Const_MM_Sequence_Iterator<SEQUENCE_T> & rhs)
+ throw()
+ {
+ std::swap (sequence_, rhs.sequence_);
+ std::swap (this->pos_, rhs.pos_);
+ }
+
+ /// Dereference operator returns a reference to the item contained
+ /// at the current position
+ const_element_type operator* (void) const
+ {
+ // Access the underlying element in the sequence.
+ return const_element_type ((*(this->sequence_))[this->pos_],
+ this->sequence_->release ());
+ }
+
+ /// Preincrement operator
+ const Const_MM_Sequence_Iterator<SEQUENCE_T> &operator++ (void) const
+ {
+ // Increment the position.
+ ++this->pos_;
+ return * this;
+ }
+
+ /// Postincrement operator
+ Const_MM_Sequence_Iterator<SEQUENCE_T> operator++ (int) const
+ {
+ // Create a temporary to return so that it's not modified.
+ Const_MM_Sequence_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
+ // Increment the position.
+ // We also need to check if we're now past the end.
+ ++this->pos_;
+ return temp_iter;
+ }
+
+ /// Predecrement operator
+ const Const_MM_Sequence_Iterator<SEQUENCE_T> &operator-- (void) const
+ {
+ --this->pos_;
+ return * this;
+ }
+
+ /// Postdecrement operator
+ Const_MM_Sequence_Iterator<SEQUENCE_T> operator-- (int) const
+ {
+ // Create a temporary to return so that it's not modified.
+ Const_MM_Sequence_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
+ --this->pos_;
+ return temp_iter;
+ }
+
+ /// Iterator addition
+ const Const_MM_Sequence_Iterator<SEQUENCE_T> &operator+= (difference_type n) const
+ {
+ // Move ahead n elements.
+ this->pos_ += n;
+ return * this;
+ }
+
+ /// Iterator addition
+ Const_MM_Sequence_Iterator<SEQUENCE_T> operator+ (difference_type n) const
+ {
+ // Create a temporary to return and move it ahead n elements.
+ return Const_MM_Sequence_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ + n);
+ }
+
+ /// Iterator subtraction
+ const Const_MM_Sequence_Iterator<SEQUENCE_T> &operator-= (difference_type n) const
+ {
+ // Move back n elements.
+ this->pos_ -= n;
+ return * this;
+ }
+
+ /// Iterator subtraction
+ Const_MM_Sequence_Iterator<SEQUENCE_T> operator- (difference_type n) const
+ {
+ // Create a temporary to return and move it back n elements.
+ return Const_MM_Sequence_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ - n);
+ }
+
+ /// Difference
+ difference_type operator- (const Const_MM_Sequence_Iterator<SEQUENCE_T> & rhs) const
+ {
+ // I think the order is important here (i.e., this before rhs).
+ return this->pos_ - rhs.pos_;
+ }
+
+ /// Element operator
+ const_element_type operator[] (difference_type n) const
+ {
+ // Return the element at position pos_ + n
+ return const_element_type ((*(this->sequence_))[this->pos_ + n],
+ this->sequence_->release ());
+ }
+
+ /// Less than
+ virtual bool operator< (const Const_MM_Sequence_Iterator<SEQUENCE_T> & rhs) const
+ {
+ // Return if this iterator is less than the passed in iterator.
+ return this->pos_ < rhs.pos_;
+ }
+
+ /// Equality operator
+ bool operator== (const Const_MM_Sequence_Iterator<SEQUENCE_T> &rhs) const
+ {
+ // Compare all the data members for equality.
+ return this->sequence_ == rhs.sequence_
+ && this->pos_ == rhs.pos_;
+ }
+
+ /// Nonequality operator
+ bool operator!= (const Const_MM_Sequence_Iterator<SEQUENCE_T> &rhs) const
+ {
+ return !(*this == rhs);
+ }
+
+private:
+ /// the sequence with which we are dealing
+ const implementation_type *sequence_;
+
+ /// Our current position in the sequence.
+ mutable difference_type pos_;
+};
+
+/// Iterator addition with the difference_type being the first argument.
+template<typename SEQUENCE_T>
+ Const_MM_Sequence_Iterator<SEQUENCE_T> operator+
+ (typename MM_Sequence_Iterator<SEQUENCE_T>::difference_type n,
+ Const_MM_Sequence_Iterator<SEQUENCE_T> iter)
+ {
+ // Create an iter and move it ahead n elements.
+ return Const_MM_Sequence_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ + n);
+ }
+
+/// Iterator subtraction with the difference_type being the first argument.
+template<typename SEQUENCE_T>
+ Const_MM_Sequence_Iterator<SEQUENCE_T> operator-
+ (typename MM_Sequence_Iterator<SEQUENCE_T>::difference_type n,
+ Const_MM_Sequence_Iterator<SEQUENCE_T> iter)
+ {
+ // Create an iter and move it back n elements.
+ return Const_MM_Sequence_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ - n);
+ }
+
+
+/**
+ * @class MM_Sequence_Reverse_Iterator
+ * @brief Implements a reverse random access iterator for generic sequence type
+ * classes that need to manage memory. MM stands for memory managed.
+ */
+template <typename SEQUENCE_T>
+class MM_Sequence_Reverse_Iterator
+{
+ friend class Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T>;
+
+public:
+ // = Necessary traits
+ typedef std::random_access_iterator_tag iterator_category;
+ typedef typename SEQUENCE_T::value_type value_type;
+ typedef typename SEQUENCE_T::value_type *pointer;
+ typedef typename SEQUENCE_T::value_type &reference;
+ typedef typename SEQUENCE_T::element_type element_type;
+ typedef typename SEQUENCE_T::const_element_type const_element_type;
+ typedef typename SEQUENCE_T::allocation_traits allocation_traits;
+ typedef typename SEQUENCE_T::element_traits element_traits;
+ typedef typename SEQUENCE_T::implementation_type implementation_type;
+ typedef int difference_type;
+
+ /// Construct a MM_Sequence_Reverse_Iterator at position pos
+ MM_Sequence_Reverse_Iterator (implementation_type *sequence,
+ size_t pos)
+ : sequence_ (sequence),
+ pos_ (pos)
+ {
+ }
+
+ /// Copy constructor
+ MM_Sequence_Reverse_Iterator (
+ MM_Sequence_Reverse_Iterator<SEQUENCE_T> const & rhs)
+ : sequence_ (rhs.sequence_),
+ pos_ (rhs.pos_)
+ {
+ }
+
+ /// Assignment operator
+ MM_Sequence_Reverse_Iterator & operator= (
+ MM_Sequence_Reverse_Iterator<SEQUENCE_T> const & rhs)
+ {
+ MM_Sequence_Reverse_Iterator tmp(rhs);
+ swap (tmp);
+ return * this;
+ }
+
+ /// swaps all members
+ void swap(MM_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs)
+ throw()
+ {
+ std::swap (sequence_, rhs.sequence_);
+ std::swap (this->pos_, rhs.pos_);
+ }
+
+ /// Dereference operator returns a reference to the item contained
+ /// at the current position
+ element_type operator* (void)
+ {
+ // Access the underlying element in the sequence.
+ return element_type ((*(this->sequence_))[this->pos_],
+ this->sequence_->release ());
+ }
+
+ /// Returns a const reference to the item contained at the current position
+ const_element_type operator* (void) const
+ {
+ // Access the underlying element in the sequence.
+ return const_element_type ((*(this->sequence_))[this->pos_],
+ this->sequence_->release ());
+ }
+
+ /// Preincrement operator
+ MM_Sequence_Reverse_Iterator<SEQUENCE_T> &operator++ (void)
+ {
+ // Decrement the position for reverse iterators.
+ // We also need to check if we're now before the start.
+ --this->pos_;
+ return *this;
+ }
+
+ /// Postincrement operator
+ MM_Sequence_Reverse_Iterator<SEQUENCE_T> operator++ (int)
+ {
+ // Create a temporary to return so that it's not modified.
+ MM_Sequence_Reverse_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
+ // Decrement the position for reverse iterators.
+ // We also need to check if we're now past the end.
+ --this->pos_;
+ return temp_iter;
+ }
+
+ /// Predecrement operator
+ MM_Sequence_Reverse_Iterator<SEQUENCE_T> &operator-- (void)
+ {
+ // Increment the position for reverse iterators.
+ ++this->pos_;
+ return *this;
+ }
+
+ /// Postdecrement operator
+ MM_Sequence_Reverse_Iterator<SEQUENCE_T> operator-- (int)
+ {
+ // Create a temporary to return so that it's not modified.
+ MM_Sequence_Reverse_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
+ // Increment the position for reverse iterators.
+ ++this->pos_;
+ return temp_iter;
+ }
+
+ /// Iterator addition
+ MM_Sequence_Reverse_Iterator<SEQUENCE_T> &operator+= (difference_type n)
+ {
+ // Move back n elements for reverse iterators.
+ this->pos_ -= n;
+ return *this;
+ }
+
+ /// Iterator addition
+ MM_Sequence_Reverse_Iterator<SEQUENCE_T> operator+ (difference_type n)
+ {
+ // Create a temporary to return and move it back n elements for
+ // reverse iterators.
+ return MM_Sequence_Reverse_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ - n);
+ }
+
+ /// Iterator subtraction
+ MM_Sequence_Reverse_Iterator<SEQUENCE_T> &operator-= (difference_type n)
+ {
+ // Move ahead n elements for reverse iterators.
+ this->pos_ += n;
+ return *this;
+ }
+
+ /// Iterator subtraction
+ MM_Sequence_Reverse_Iterator<SEQUENCE_T> operator- (difference_type n)
+ {
+ // Create a temporary to return and move it ahead n elements for
+ // reverse iterators.
+ return MM_Sequence_Reverse_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ + n);
+ }
+
+ /// Difference
+ difference_type operator- (const MM_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs)
+ {
+ // I think order is important here (i.e., rhs before this).
+ return rhs.pos_ - this->pos_;
+ }
+
+ /// Difference
+ difference_type operator- (const Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs)
+ {
+ // I think order is important here (i.e., rhs before this).
+ return rhs.pos_ - this->pos_;
+ }
+
+ /// Element operator/assignment
+ element_type operator[] (difference_type n)
+ {
+ // Return the element at position pos_ + n
+ return element_type ((*(this->sequence_))[this->pos_ + n],
+ this->sequence_->release ());
+ }
+
+ /// Element operator/assignment
+ const_element_type operator[] (difference_type n) const
+ {
+ // Return the element at position pos_ + n
+ return const_element_type ((*(this->sequence_))[this->pos_ + n],
+ this->sequence_->release ());
+ }
+
+ /// Less than
+ bool operator< (const MM_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs)
+ {
+ // Return if this iterator is less than the passed in iterator.
+ // For reverse iterators reverse the logic.
+ return this->pos_ > rhs.pos_;
+ }
+
+ /// Less than
+ bool operator< (const Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs)
+ {
+ // Return if this iterator is less than the passed in iterator.
+ // For reverse iterators reverse the logic.
+ return this->pos_ > rhs.pos_;
+ }
+
+
+ /// Equality operator
+ bool operator== (const MM_Sequence_Reverse_Iterator<SEQUENCE_T> &rhs) const
+ {
+ // Compare all the data members for equality.
+ return this->sequence_ == rhs.sequence_
+ && this->pos_ == rhs.pos_;
+ }
+
+ /// Equality operator
+ bool operator== (const Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> &rhs) const
+ {
+ // Compare all the data members for equality.
+ return this->sequence_ == rhs.sequence_
+ && this->pos_ == rhs.pos_;
+ }
+
+ /// Nonequality operator
+ bool operator!= (const MM_Sequence_Reverse_Iterator<SEQUENCE_T> &rhs) const
+ {
+ return !(*this == rhs);
+ }
+
+ /// Nonequality operator
+ bool operator!= (const Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> &rhs) const
+ {
+ return !(*this == rhs);
+ }
+
+private:
+ /// The sequence with which we are dealing
+ implementation_type *sequence_;
+
+ /// Our current position in the sequence.
+ mutable difference_type pos_;
+};
+
+/// Iterator addition with the difference_type being the first argument.
+template<typename SEQUENCE_T>
+ MM_Sequence_Reverse_Iterator<SEQUENCE_T> operator+
+ (typename MM_Sequence_Reverse_Iterator<SEQUENCE_T>::difference_type n,
+ MM_Sequence_Reverse_Iterator<SEQUENCE_T> iter)
+ {
+ // Create an iter and move it back n elements for reverse iterators.
+ return MM_Sequence_Reverse_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ - n);
+ }
+
+/// Iterator subtraction with the difference_type being the first argument.
+template<typename SEQUENCE_T>
+ MM_Sequence_Reverse_Iterator<SEQUENCE_T> operator-
+ (typename MM_Sequence_Reverse_Iterator<SEQUENCE_T>::difference_type n,
+ MM_Sequence_Reverse_Iterator<SEQUENCE_T> iter)
+ {
+ // Create an iter and move it ahead n elements for reverse iterators.
+ return MM_Sequence_Reverse_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ + n);
+ }
+
+
+/**
+ * @class Const_MM_Sequence_Reverse_Iterator
+ * @brief Implements a constant reverse random access iterator for generic
+ * sequence type classes that need to manage memory. MM stands for
+ * memory managed.
+ *
+ * Note: Having a const Iterator does not guarantee that the current
+ * *position* that it points to will not change, it only guarantees that
+ * you cannot change the underlying array!
+ */
+template <typename SEQUENCE_T>
+class Const_MM_Sequence_Reverse_Iterator
+{
+ friend class MM_Sequence_Reverse_Iterator<SEQUENCE_T>;
+
+public:
+ // = Necessary traits
+ typedef std::random_access_iterator_tag iterator_category;
+ typedef typename SEQUENCE_T::value_type value_type;
+ typedef typename SEQUENCE_T::value_type *pointer;
+ typedef typename SEQUENCE_T::value_type &reference;
+ typedef typename SEQUENCE_T::const_element_type const_element_type;
+ typedef typename SEQUENCE_T::allocation_traits allocation_traits;
+ typedef typename SEQUENCE_T::element_traits element_traits;
+ typedef typename SEQUENCE_T::implementation_type implementation_type;
+ typedef int difference_type;
+
+ /// Construct a Const_MM_Sequence_Reverse_Iterator at position pos
+ /// using a const sequence.
+ Const_MM_Sequence_Reverse_Iterator (const implementation_type *sequence,
+ size_t pos)
+ : sequence_ (sequence),
+ pos_ (pos)
+ {
+ }
+
+ /// Copy constructor
+ Const_MM_Sequence_Reverse_Iterator (
+ Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> const & rhs)
+ : sequence_ (rhs.sequence_),
+ pos_ (rhs.pos_)
+ {
+ }
+
+ /// Copy constructor
+ Const_MM_Sequence_Reverse_Iterator (
+ MM_Sequence_Reverse_Iterator<SEQUENCE_T> const & rhs)
+ : sequence_ (rhs.sequence_),
+ pos_ (rhs.pos_)
+ {
+ }
+
+ /// Assignment operator
+ Const_MM_Sequence_Reverse_Iterator & operator= (
+ Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> const & rhs)
+ {
+ Const_MM_Sequence_Reverse_Iterator tmp(rhs);
+ swap (tmp);
+ return * this;
+ }
+
+ /// swaps all members
+ void swap(Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs)
+ throw()
+ {
+ std::swap (sequence_, rhs.sequence_);
+ std::swap (this->pos_, rhs.pos_);
+ }
+
+ /// typecast operator to MM_Sequence_Reverse_Iterator
+
+ /// Dereference operator returns a reference to the item contained
+ /// at the current position
+ const_element_type operator* (void) const
+ {
+ // Access the underlying element in the sequence.
+ return const_element_type ((*(this->sequence_))[this->pos_],
+ this->sequence_->release ());
+ }
+
+ /// Preincrement operator
+ const Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> &operator++ (void) const
+ {
+ // Decrement the position for reveres iterators.
+ // We also need to check if we're now before the start.
+ --this->pos_;
+ return *this;
+ }
+
+ /// Postincrement operator
+ Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> operator++ (int) const
+ {
+ // Create a temporary to return so that it's not modified.
+ Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
+ // Decrement the position for reverse iterators.
+ // We also need to check if we're now before the start.
+ --this->pos_;
+ return temp_iter;
+ }
+
+ /// Predecrement operator
+ const Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> &operator-- (void) const
+ {
+ // Increment the position for reverse iterators.
+ ++this->pos_;
+ return *this;
+ }
+
+ /// Postdecrement operator
+ Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> operator-- (int) const
+ {
+ // Create a temporary to return so that it's not modified.
+ Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
+ // Increment the position for reverse iterators.
+ ++this->pos_;
+ return temp_iter;
+ }
+
+ /// Iterator addition
+ const Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> &operator+= (difference_type n) const
+ {
+ // Move back n elements for reverse iterators.
+ this->pos_ -= n;
+ return *this;
+ }
+
+ /// Iterator addition
+ Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> operator+ (difference_type n) const
+ {
+ // Create a temporary to return and move it back n elements for
+ // reverse iterators.
+ return Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ - n);
+ }
+
+ /// Iterator subtraction
+ const Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> &operator-= (difference_type n) const
+ {
+ // Move ahead n elements for reverse iterators.
+ this->pos_ += n;
+ return *this;
+ }
+
+ /// Iterator subtraction
+ Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> operator- (difference_type n) const
+ {
+ // Create a temporary to return and move it ahead n elements for
+ // reverse iterators.
+ return Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ + n);
+ }
+
+ /// Difference
+ difference_type operator- (const Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs) const
+ {
+ // I think order is important here (i.e., rhs before this).
+ return rhs.pos_ - this->pos_;
+ }
+
+ /// Element operator/assignment
+ const_element_type operator[] (difference_type n) const
+ {
+ // Return the element at position pos_ + n
+ return const_element_type ((*(this->sequence_))[this->pos_ + n],
+ this->sequence_->release ());
+ }
+
+ /// Less than
+ bool operator< (const Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs) const
+ {
+ // Return if this iterator is less than the passed in iterator.
+ // For reverse iterators reverse the logic.
+ return this->pos_ > rhs.pos_;
+ }
+
+ /// Equality operator
+ bool operator== (const Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> &rhs) const
+ {
+ // Compare all the data members for equality.
+ return this->sequence_ == rhs.sequence_
+ && this->pos_ == rhs.pos_;
+ }
+
+ /// Nonequality operator
+ bool operator!= (const Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> &rhs) const
+ {
+ return !(*this == rhs);
+ }
+
+private:
+ /// the sequence with which we are dealing
+ const implementation_type *sequence_;
+
+ /// Our current position in the sequence.
+ mutable difference_type pos_;
+};
+
+/// Iterator addition with the difference_type being the first argument.
+template<typename SEQUENCE_T>
+ Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> operator+
+ (typename Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T>::difference_type n,
+ Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> iter)
+ {
+ // Create an iter and move it back n elements for reverse iterators.
+ return Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ - n);
+ }
+
+/// Iterator subtraction with the difference_type being the first argument.
+template<typename SEQUENCE_T>
+ Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> operator-
+ (typename Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T>::difference_type n,
+ Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> iter)
+ {
+ // Create an iter and move it ahead n elements for reverse iterators.
+ return Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ + n);
+ }
+
+
+} // namespace TAO
+
+#endif // TAO_HAS_SEQUENCE_ITERATORS
+
+#endif // mm_sequence_iterator_h
diff --git a/TAO/tao/Unbounded_Basic_String_Sequence_T.h b/TAO/tao/Unbounded_Basic_String_Sequence_T.h
index b43ef6764f6..25a2e7b6bbe 100644
--- a/TAO/tao/Unbounded_Basic_String_Sequence_T.h
+++ b/TAO/tao/Unbounded_Basic_String_Sequence_T.h
@@ -14,6 +14,7 @@
#include "tao/Generic_Sequence_T.h"
#include "tao/String_Sequence_Element_T.h"
#include "tao/String_Const_Sequence_Element_T.h"
+#include "tao/MM_Sequence_Iterator_T.h"
TAO_BEGIN_VERSIONED_NAMESPACE_DECL
@@ -113,9 +114,116 @@ public:
}
+#if TAO_HAS_SEQUENCE_ITERATORS
+
+ ///
+ /// Additions to support iterator semantics for TAO unbounded basic
+ /// string sequences.
+ ///
+
+ // = Traits and factory methods that create iterators.
+ typedef MM_Sequence_Iterator<unbounded_basic_string_sequence<charT> > iterator;
+ typedef Const_MM_Sequence_Iterator<unbounded_basic_string_sequence<charT> > const_iterator;
+ typedef MM_Sequence_Reverse_Iterator<unbounded_basic_string_sequence<charT> > reverse_iterator;
+ typedef Const_MM_Sequence_Reverse_Iterator<unbounded_basic_string_sequence<charT> > const_reverse_iterator;
+
+ // Get an iterator that points to the beginning of the sequence.
+ inline iterator begin (void)
+ {
+ return iterator (&this->impl_);
+ }
+
+ // Get a const iterator that points to the beginning of the sequence.
+ inline const_iterator begin (void) const
+ {
+ return const_iterator (&this->impl_);
+ }
+
+ // Get an iterator that points to the end of the sequence.
+ inline iterator end (void)
+ {
+ return iterator (&this->impl_,
+ this->impl_.length ());
+ }
+
+ // Get a const iterator that points to the end of the sequence.
+ inline const_iterator end (void) const
+ {
+ return const_iterator (&this->impl_,
+ this->impl_.length ());
+ }
+
+ // Get a reverse iterator that points to the end of the sequence.
+ inline reverse_iterator rbegin (void)
+ {
+ return reverse_iterator (&this->impl_,
+ this->impl_.length () - 1);
+ }
+
+ // Get a const reverse iterator that points to the end of the sequence.
+ inline const_reverse_iterator rbegin (void) const
+ {
+ return const_reverse_iterator (&this->impl_,
+ this->impl_.length () - 1);
+ }
+
+ // Get a reverse iterator that points to one before the beginning
+ // of the sequence.
+ inline reverse_iterator rend (void)
+ {
+ return reverse_iterator (&this->impl_,
+ -1);
+ }
+
+ // Get a const reverse iterator that points to one before the
+ // beginning of the sequence.
+ inline const_reverse_iterator rend (void) const
+ {
+ return const_reverse_iterator (&this->impl_,
+ -1);
+ }
+
+#endif /* TAO_HAS_SEQUENCE_ITERATORS */
+
private:
implementation_type impl_;
};
+
+#if TAO_HAS_SEQUENCE_ITERATORS
+/*
+// Below is an attempt at template specialization that would
+// not compile. It might be useful later.
+// Generic_Sequence_Iterator template specializations for
+// Unbounded_Basic_String_Sequence. These are needed since
+// Unbounded_Basic_String_Sequence does some memory management with
+// the strings. Without these specialization we leak memory.
+
+/// Dereference operator returns a reference to the item contained
+/// at the current position. This dereference implies string
+/// memory management.
+// template<typename charT>
+ unbounded_basic_string_sequence<char>::element_type&
+ details::Generic_Sequence_Iterator<unbounded_basic_string_sequence<char>, unbounded_basic_string_sequence::allocation_traits, unbounded_basic_string_sequence::element_traits >::operator* (void)
+ {
+ // Access the underlying element in the sequence.
+ //return element_type (impl_[i], release());
+ return element_type ((*(this->sequence_))[this->pos_],
+ this->sequence_->release());
+ }
+
+ /// Returns a const reference to the item contained at the current position
+ // template<typename charT>
+ unbounded_basic_string_sequence<char>::const_element_type&
+ details::Generic_Sequence_Iterator<unbounded_basic_string_sequence<char> >::operator* (void) const
+ {
+ // Access the underlying element in the sequence.
+ //return const_element_type (impl_[i], release());
+ return const_element_type ((*(this->sequence_))[this->pos_],
+ this->sequence_->release ());
+ }
+*/
+#endif /* TAO_HAS_SEQUENCE_ITERATORS */
+
} // namespace TAO
TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/tao/Unbounded_Object_Reference_Sequence_T.h b/TAO/tao/Unbounded_Object_Reference_Sequence_T.h
index 50d1ae9fd9b..c5daa830154 100644
--- a/TAO/tao/Unbounded_Object_Reference_Sequence_T.h
+++ b/TAO/tao/Unbounded_Object_Reference_Sequence_T.h
@@ -14,6 +14,7 @@
#include "Generic_Sequence_T.h"
#include "Object_Reference_Sequence_Element_T.h"
#include "Object_Reference_Const_Sequence_Element_T.h"
+#include "tao/MM_Sequence_Iterator_T.h"
TAO_BEGIN_VERSIONED_NAMESPACE_DECL
@@ -108,6 +109,77 @@ public:
}
+#if TAO_HAS_SEQUENCE_ITERATORS
+
+ ///
+ /// Additions to support iterator semantics for TAO unbounded object reference
+ /// sequences.
+ ///
+
+ // = Traits and factory methods that create iterators.
+ typedef MM_Sequence_Iterator<unbounded_object_reference_sequence<object_t, object_t_var> > iterator;
+ typedef Const_MM_Sequence_Iterator<unbounded_object_reference_sequence<object_t, object_t_var> > const_iterator;
+ typedef MM_Sequence_Reverse_Iterator<unbounded_object_reference_sequence<object_t, object_t_var> > reverse_iterator;
+ typedef Const_MM_Sequence_Reverse_Iterator<unbounded_object_reference_sequence<object_t, object_t_var> > const_reverse_iterator;
+
+ // Get an iterator that points to the beginning of the sequence.
+ iterator begin (void)
+ {
+ return iterator (&this->impl_);
+ }
+
+ // Get a const iterator that points to the beginning of the sequence.
+ const_iterator begin (void) const
+ {
+ return const_iterator (&this->impl_);
+ }
+
+ // Get an iterator that points to the end of the sequence.
+ iterator end (void)
+ {
+ return iterator (&this->impl_,
+ this->impl_.length ());
+ }
+
+ // Get a const iterator that points to the end of the sequence.
+ const_iterator end (void) const
+ {
+ return const_iterator (&this->impl_,
+ this->impl_.length ());
+ }
+
+ // Get a reverse iterator that points to the end of the sequence.
+ reverse_iterator rbegin (void)
+ {
+ return reverse_iterator (&this->impl_,
+ this->impl_.length () - 1);
+ }
+
+ // Get a const reverse iterator that points to the end of the sequence.
+ const_reverse_iterator rbegin (void) const
+ {
+ return const_reverse_iterator (&this->impl_,
+ this->impl_.length () - 1);
+ }
+
+ // Get a reverse iterator that points to one before the beginning
+ // of the sequence.
+ reverse_iterator rend (void)
+ {
+ return reverse_iterator (&this->impl_,
+ -1);
+ }
+
+ // Get a const reverse iterator that points to one before the
+ // beginning of the sequence.
+ const_reverse_iterator rend (void) const
+ {
+ return const_reverse_iterator (&this->impl_,
+ -1);
+ }
+
+#endif /* TAO_HAS_SEQUENCE_ITERATORS */
+
private:
implementation_type impl_;
};
diff --git a/TAO/tao/Unbounded_Value_Sequence_T.h b/TAO/tao/Unbounded_Value_Sequence_T.h
index e39893e1f5c..3660c77af75 100644
--- a/TAO/tao/Unbounded_Value_Sequence_T.h
+++ b/TAO/tao/Unbounded_Value_Sequence_T.h
@@ -89,6 +89,71 @@ public:
implementation_type::freebuf(buffer);
}
+#if TAO_HAS_SEQUENCE_ITERATORS
+
+ ///
+ /// Additions to support iterator semantics for TAO unbounded value
+ /// sequences.
+ ///
+
+ // = Traits and factory methods that create iterators.
+ typedef details::Generic_Sequence_Iterator<details::generic_sequence<value_type, allocation_traits, element_traits> > iterator;
+ typedef details::Const_Generic_Sequence_Iterator<details::generic_sequence<value_type, allocation_traits, element_traits> > const_iterator;
+ typedef details::Generic_Sequence_Reverse_Iterator<details::generic_sequence<value_type, allocation_traits, element_traits> > reverse_iterator;
+ typedef details::Const_Generic_Sequence_Reverse_Iterator<details::generic_sequence<value_type, allocation_traits, element_traits> > const_reverse_iterator;
+
+ // Get an iterator that points to the beginning of the sequence.
+ iterator begin (void)
+ {
+ return impl_.begin ();
+ }
+
+ // Get a const iterator that points to the beginning of the sequence.
+ const_iterator begin (void) const
+ {
+ return impl_.begin ();
+ }
+
+ // Get an iterator that points to the end of the sequence.
+ iterator end (void)
+ {
+ return impl_.end ();
+ }
+
+ // Get a const iterator that points to the end of the sequence.
+ const_iterator end (void) const
+ {
+ return impl_.end ();
+ }
+
+ // Get a reverse iterator that points to the end of the sequence.
+ reverse_iterator rbegin (void)
+ {
+ return impl_.rbegin ();
+ }
+
+ // Get a const reverse iterator that points to the end of the sequence.
+ const_reverse_iterator rbegin (void) const
+ {
+ return impl_.rbegin ();
+ }
+
+ // Get a reverse iterator that points to one before the beginning
+ // of the sequence.
+ reverse_iterator rend (void)
+ {
+ return impl_.rend ();
+ }
+
+ // Get a const reverse iterator that points to one before the
+ // beginning of the sequence.
+ const_reverse_iterator rend (void) const
+ {
+ return impl_.rend ();
+ }
+
+#endif /* TAO_HAS_SEQUENCE_ITERATORS */
+
private:
implementation_type impl_;
};
diff --git a/TAO/tao/orbconf.h b/TAO/tao/orbconf.h
index 4f0d9f92bf7..17a6eb18a09 100644
--- a/TAO/tao/orbconf.h
+++ b/TAO/tao/orbconf.h
@@ -911,6 +911,10 @@ enum TAO_Policy_Scope
# endif
#endif
+#if !defined (TAO_HAS_SEQUENCE_ITERATORS)
+# define TAO_HAS_SEQUENCE_ITERATORS 1
+#endif
+
TAO_END_VERSIONED_NAMESPACE_DECL
#include /**/ "ace/post.h"