diff options
Diffstat (limited to 'libxsd/xsd/cxx/tree/containers.hxx')
-rw-r--r-- | libxsd/xsd/cxx/tree/containers.hxx | 256 |
1 files changed, 2 insertions, 254 deletions
diff --git a/libxsd/xsd/cxx/tree/containers.hxx b/libxsd/xsd/cxx/tree/containers.hxx index c89218f..cafd79d 100644 --- a/libxsd/xsd/cxx/tree/containers.hxx +++ b/libxsd/xsd/cxx/tree/containers.hxx @@ -5,17 +5,15 @@ #ifndef XSD_CXX_TREE_CONTAINERS_HXX #define XSD_CXX_TREE_CONTAINERS_HXX -#include <cstddef> // std::ptrdiff_t -#include <string> #include <vector> #include <memory> // std::auto_ptr/unique_ptr -#include <iterator> // std::iterator_traits #include <algorithm> // std::equal, std::lexicographical_compare #include <iosfwd> #include <xsd/cxx/config.hxx> // XSD_AUTO_PTR #include <xsd/cxx/tree/elements.hxx> +#include <xsd/cxx/tree/iterator-adapter.hxx> namespace xsd { @@ -515,7 +513,7 @@ namespace xsd return !(a < b); } - // Provide an ostream insertion opretaor to prevent confusion from + // Provide an ostream insertion operator to prevent confusion from // the implicit bool conversion. // template <typename C, typename T, bool fund> @@ -528,256 +526,6 @@ namespace xsd template <typename T, bool fund = fundamental_p<T>::r> class sequence; - // Sun CC's <iterator> does not have iterator_traits. To overcome - // this, we will wrap std::iterator_traits into our own and also - // specialize it for pointer types. Since Sun CC uses pointer - // for vector::iterator, it will use the specialization and won't - // notice the std::iterator_traits. - // -#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC - template <typename I> - struct iterator_traits - { - typedef - typename std::iterator_traits<I>::iterator_category - iterator_category; - - typedef - typename std::iterator_traits<I>::value_type - value_type; - - typedef - typename std::iterator_traits<I>::difference_type - difference_type; - }; -#else - // The Pointer specialization does not work for reverse and - // set iterators. But these iterators are user-dfined types - // and have suitable typedefs that we can use. - // - template <typename I> - struct iterator_traits - { - typedef typename I::iterator_category iterator_category; - typedef typename I::value_type value_type; - typedef typename I::difference_type difference_type; - }; - - template <typename T> - struct iterator_traits<T*> - { - typedef std::random_access_iterator_tag iterator_category; - typedef T value_type; - typedef std::ptrdiff_t difference_type; - }; -#endif - - // Iterator adapter for complex types. It expects I to point to - // a smart pointer-like object that has operator*() that returns - // a refernce to a type static_cast'able to T and get() that - // returns a pointer to a type static_cast'able to T. - // - - template <typename I, typename T> - struct iterator_adapter - { - typedef T value_type; - typedef value_type& reference; - typedef value_type* pointer; - - typedef - typename iterator_traits<I>::iterator_category - iterator_category; - - typedef - typename iterator_traits<I>::difference_type - difference_type; - - - public: - iterator_adapter () - : i_ () // i_ can be of a pointer type. - { - } - - // Allow iterator to const_iterator conversion. - // - template <typename J, typename T2> - iterator_adapter (const iterator_adapter<J, T2>& j) - : i_ (j.base ()) - { - } - - explicit - iterator_adapter (const I& i) - : i_ (i) - { - } - - public: - // Forward iterator requirements. - // - reference - operator* () const - { - return static_cast<reference> (**i_); - } - - pointer - operator-> () const - { - return static_cast<pointer> (i_->get ()); - } - - iterator_adapter& - operator++ () - { - ++i_; - return *this; - } - - iterator_adapter - operator++ (int) - { - iterator_adapter r (*this); - ++i_; - return r; - } - - // Bidirectional iterator requirements. - // - iterator_adapter& - operator-- () - { - --i_; - return *this; - } - - iterator_adapter - operator-- (int) - { - iterator_adapter r (*this); - --i_; - return r; - } - - // Random access iterator requirements. - // - reference - operator[] (difference_type n) const - { - return static_cast<reference> (*(i_[n])); - } - - iterator_adapter& - operator+= (difference_type n) - { - i_ += n; - return *this; - } - - iterator_adapter - operator+ (difference_type n) const - { - return iterator_adapter (i_ + n); - } - - iterator_adapter& - operator-= (difference_type n) - { - i_ -= n; - return *this; - } - - iterator_adapter - operator- (difference_type n) const - { - return iterator_adapter (i_ - n); - } - - public: - const I& - base () const - { - return i_; - } - - private: - I i_; - }; - - // Note: We use different types for left- and right-hand-side - // arguments to allow comparison between iterator and const_iterator. - // - - // Forward iterator requirements. - // - template <typename I, typename J, typename T1, typename T2> - inline bool - operator== (const iterator_adapter<I, T1>& i, - const iterator_adapter<J, T2>& j) - { - return i.base () == j.base (); - } - - template <typename I, typename J, typename T1, typename T2> - inline bool - operator!= (const iterator_adapter<I, T1>& i, - const iterator_adapter<J, T2>& j) - { - return i.base () != j.base (); - } - - // Random access iterator requirements - // - template <typename I, typename J, typename T1, typename T2> - inline bool - operator< (const iterator_adapter<I, T1>& i, - const iterator_adapter<J, T2>& j) - { - return i.base () < j.base (); - } - - template <typename I, typename J, typename T1, typename T2> - inline bool - operator> (const iterator_adapter<I, T1>& i, - const iterator_adapter<J, T2>& j) - { - return i.base () > j.base (); - } - - template <typename I, typename J, typename T1, typename T2> - inline bool - operator<= (const iterator_adapter<I, T1>& i, - const iterator_adapter<J, T2>& j) - { - return i.base () <= j.base (); - } - - template <typename I, typename J, typename T1, typename T2> - inline bool - operator>= (const iterator_adapter<I, T1>& i, - const iterator_adapter<J, T2>& j) - { - return i.base () >= j.base (); - } - - template <typename I, typename J, typename T1, typename T2> - inline typename iterator_adapter<I, T1>::difference_type - operator- (const iterator_adapter<I, T1>& i, - const iterator_adapter<J, T2>& j) - { - return i.base () - j.base (); - } - - template <typename I, typename T> - inline iterator_adapter<I, T> - operator+ (typename iterator_adapter<I, T>::difference_type n, - const iterator_adapter<I, T>& i) - { - return iterator_adapter<I, T> (i.base () + n); - } - // // class sequence_common |