summaryrefslogtreecommitdiff
path: root/TAO/tao/Generic_Sequence_T.h
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tao/Generic_Sequence_T.h')
-rw-r--r--TAO/tao/Generic_Sequence_T.h988
1 files changed, 1 insertions, 987 deletions
diff --git a/TAO/tao/Generic_Sequence_T.h b/TAO/tao/Generic_Sequence_T.h
index f34e92110e3..07a46d0d6f4 100644
--- a/TAO/tao/Generic_Sequence_T.h
+++ b/TAO/tao/Generic_Sequence_T.h
@@ -66,38 +66,11 @@ namespace TAO
namespace details
{
-#if defined TAO_HAS_SEQUENCE_ITERATORS && TAO_HAS_SEQUENCE_ITERATORS == 1
-
-// 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==1 */
-
template<typename T,
class ALLOCATION_TRAITS,
class ELEMENT_TRAITS>
class generic_sequence
{
-
-#if defined TAO_HAS_SEQUENCE_ITERATORS && TAO_HAS_SEQUENCE_ITERATORS == 1
-
- 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==1 */
-
public:
typedef T value_type;
typedef ALLOCATION_TRAITS allocation_traits;
@@ -105,7 +78,7 @@ public:
typedef range_checking<value_type,true> range;
/// Default constructor.
- generic_sequence(void)
+ generic_sequence()
: maximum_(allocation_traits::default_maximum())
, length_(0)
, buffer_(allocation_traits::default_buffer_allocation())
@@ -361,80 +334,6 @@ public:
allocation_traits::freebuf(buffer);
}
-#if defined TAO_HAS_SEQUENCE_ITERATORS && TAO_HAS_SEQUENCE_ITERATORS == 1
-
- ///
- /// 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==1 */
-
private:
/// The maximum number of elements the buffer can contain.
CORBA::ULong maximum_;
@@ -446,891 +345,6 @@ private:
/// destroyed.
mutable CORBA::Boolean release_;
};
-
-#if defined TAO_HAS_SEQUENCE_ITERATORS && TAO_HAS_SEQUENCE_ITERATORS == 1
-
-/**
- * @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
- explicit 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==1 */
-
} // namespace details
} // namespace TAO