670 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			670 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | // | ||
|  | // (C) Copyright Jeremy Siek 2000. | ||
|  | // Distributed under the Boost Software License, Version 1.0. (See | ||
|  | // accompanying file LICENSE_1_0.txt or copy at | ||
|  | // http://www.boost.org/LICENSE_1_0.txt) | ||
|  | // | ||
|  | // Revision History: | ||
|  | // | ||
|  | //   17 July  2001: Added const to some member functions. (Jeremy Siek)  | ||
|  | //   05 May   2001: Removed static dummy_cons object. (Jeremy Siek) | ||
|  | 
 | ||
|  | // See http://www.boost.org/libs/concept_check for documentation. | ||
|  | 
 | ||
|  | #ifndef BOOST_CONCEPT_ARCHETYPES_HPP | ||
|  | #define BOOST_CONCEPT_ARCHETYPES_HPP | ||
|  | 
 | ||
|  | #include <boost/config.hpp> | ||
|  | #include <boost/iterator.hpp> | ||
|  | #include <boost/mpl/identity.hpp> | ||
|  | #include <functional> | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | 
 | ||
|  |   //=========================================================================== | ||
|  |   // Basic Archetype Classes | ||
|  | 
 | ||
|  |   namespace detail { | ||
|  |     class dummy_constructor { }; | ||
|  |   } | ||
|  | 
 | ||
|  |   // A type that models no concept. The template parameter  | ||
|  |   // is only there so that null_archetype types can be created | ||
|  |   // that have different type. | ||
|  |   template <class T = int> | ||
|  |   class null_archetype { | ||
|  |   private: | ||
|  |     null_archetype() { } | ||
|  |     null_archetype(const null_archetype&) { } | ||
|  |     null_archetype& operator=(const null_archetype&) { return *this; } | ||
|  |   public: | ||
|  |     null_archetype(detail::dummy_constructor) { } | ||
|  | #ifndef __MWERKS__ | ||
|  |     template <class TT> | ||
|  |     friend void dummy_friend(); // just to avoid warnings | ||
|  | #endif | ||
|  |   }; | ||
|  | 
 | ||
|  |   // This is a helper class that provides a way to get a reference to | ||
|  |   // an object. The get() function will never be called at run-time | ||
|  |   // (nothing in this file will) so this seemingly very bad function | ||
|  |   // is really quite innocent. The name of this class needs to be | ||
|  |   // changed. | ||
|  |   template <class T> | ||
|  |   class static_object | ||
|  |   { | ||
|  |   public: | ||
|  |       static T& get() | ||
|  |       { | ||
|  | #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) | ||
|  |           return *reinterpret_cast<T*>(0); | ||
|  | #else  | ||
|  |           static char d[sizeof(T)]; | ||
|  |           return *reinterpret_cast<T*>(d); | ||
|  | #endif  | ||
|  |       } | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <class Base = null_archetype<> > | ||
|  |   class default_constructible_archetype : public Base { | ||
|  |   public: | ||
|  |     default_constructible_archetype()  | ||
|  |       : Base(static_object<detail::dummy_constructor>::get()) { } | ||
|  |     default_constructible_archetype(detail::dummy_constructor x) : Base(x) { } | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <class Base = null_archetype<> > | ||
|  |   class assignable_archetype : public Base { | ||
|  |     assignable_archetype() { } | ||
|  |     assignable_archetype(const assignable_archetype&) { } | ||
|  |   public: | ||
|  |     assignable_archetype& operator=(const assignable_archetype&) { | ||
|  |       return *this; | ||
|  |     } | ||
|  |     assignable_archetype(detail::dummy_constructor x) : Base(x) { } | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <class Base = null_archetype<> > | ||
|  |   class copy_constructible_archetype : public Base { | ||
|  |   public: | ||
|  |     copy_constructible_archetype()  | ||
|  |       : Base(static_object<detail::dummy_constructor>::get()) { } | ||
|  |     copy_constructible_archetype(const copy_constructible_archetype&) | ||
|  |       : Base(static_object<detail::dummy_constructor>::get()) { } | ||
|  |     copy_constructible_archetype(detail::dummy_constructor x) : Base(x) { } | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <class Base = null_archetype<> > | ||
|  |   class sgi_assignable_archetype : public Base { | ||
|  |   public: | ||
|  |     sgi_assignable_archetype(const sgi_assignable_archetype&) | ||
|  |       : Base(static_object<detail::dummy_constructor>::get()) { } | ||
|  |     sgi_assignable_archetype& operator=(const sgi_assignable_archetype&) { | ||
|  |       return *this; | ||
|  |     } | ||
|  |     sgi_assignable_archetype(const detail::dummy_constructor& x) : Base(x) { } | ||
|  |   }; | ||
|  | 
 | ||
|  |   struct default_archetype_base { | ||
|  |     default_archetype_base(detail::dummy_constructor) { } | ||
|  |   }; | ||
|  | 
 | ||
|  |   // Careful, don't use same type for T and Base. That results in the | ||
|  |   // conversion operator being invalid.  Since T is often | ||
|  |   // null_archetype, can't use null_archetype for Base. | ||
|  |   template <class T, class Base = default_archetype_base> | ||
|  |   class convertible_to_archetype : public Base { | ||
|  |   private: | ||
|  |     convertible_to_archetype() { } | ||
|  |     convertible_to_archetype(const convertible_to_archetype& ) { } | ||
|  |     convertible_to_archetype& operator=(const convertible_to_archetype&) | ||
|  |       { return *this; } | ||
|  |   public: | ||
|  |     convertible_to_archetype(detail::dummy_constructor x) : Base(x) { } | ||
|  |     operator const T&() const { return static_object<T>::get(); } | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <class T, class Base = default_archetype_base> | ||
|  |   class convertible_from_archetype : public Base { | ||
|  |   private: | ||
|  |     convertible_from_archetype() { } | ||
|  |     convertible_from_archetype(const convertible_from_archetype& ) { } | ||
|  |     convertible_from_archetype& operator=(const convertible_from_archetype&) | ||
|  |       { return *this; } | ||
|  |   public: | ||
|  |     convertible_from_archetype(detail::dummy_constructor x) : Base(x) { } | ||
|  |     convertible_from_archetype(const T&) { } | ||
|  |     convertible_from_archetype& operator=(const T&) | ||
|  |       { return *this; } | ||
|  |   }; | ||
|  | 
 | ||
|  |   class boolean_archetype { | ||
|  |   public: | ||
|  |     boolean_archetype(const boolean_archetype&) { } | ||
|  |     operator bool() const { return true; } | ||
|  |     boolean_archetype(detail::dummy_constructor) { } | ||
|  |   private: | ||
|  |     boolean_archetype() { } | ||
|  |     boolean_archetype& operator=(const boolean_archetype&) { return *this; } | ||
|  |   }; | ||
|  |    | ||
|  |   template <class Base = null_archetype<> > | ||
|  |   class equality_comparable_archetype : public Base { | ||
|  |   public: | ||
|  |     equality_comparable_archetype(detail::dummy_constructor x) : Base(x) { } | ||
|  |   }; | ||
|  |   template <class Base> | ||
|  |   boolean_archetype | ||
|  |   operator==(const equality_comparable_archetype<Base>&, | ||
|  |              const equality_comparable_archetype<Base>&)  | ||
|  |   {  | ||
|  |     return boolean_archetype(static_object<detail::dummy_constructor>::get()); | ||
|  |   } | ||
|  |   template <class Base> | ||
|  |   boolean_archetype | ||
|  |   operator!=(const equality_comparable_archetype<Base>&, | ||
|  |              const equality_comparable_archetype<Base>&) | ||
|  |   { | ||
|  |     return boolean_archetype(static_object<detail::dummy_constructor>::get()); | ||
|  |   } | ||
|  | 
 | ||
|  | 
 | ||
|  |   template <class Base = null_archetype<> > | ||
|  |   class equality_comparable2_first_archetype : public Base { | ||
|  |   public: | ||
|  |     equality_comparable2_first_archetype(detail::dummy_constructor x)  | ||
|  |       : Base(x) { } | ||
|  |   }; | ||
|  |   template <class Base = null_archetype<> > | ||
|  |   class equality_comparable2_second_archetype : public Base { | ||
|  |   public: | ||
|  |     equality_comparable2_second_archetype(detail::dummy_constructor x)  | ||
|  |       : Base(x) { } | ||
|  |   }; | ||
|  |   template <class Base1, class Base2> | ||
|  |   boolean_archetype | ||
|  |   operator==(const equality_comparable2_first_archetype<Base1>&, | ||
|  |              const equality_comparable2_second_archetype<Base2>&)  | ||
|  |   { | ||
|  |     return boolean_archetype(static_object<detail::dummy_constructor>::get()); | ||
|  |   } | ||
|  |   template <class Base1, class Base2> | ||
|  |   boolean_archetype | ||
|  |   operator!=(const equality_comparable2_first_archetype<Base1>&, | ||
|  |              const equality_comparable2_second_archetype<Base2>&) | ||
|  |   { | ||
|  |     return boolean_archetype(static_object<detail::dummy_constructor>::get()); | ||
|  |   } | ||
|  | 
 | ||
|  | 
 | ||
|  |   template <class Base = null_archetype<> > | ||
|  |   class less_than_comparable_archetype : public Base { | ||
|  |   public: | ||
|  |     less_than_comparable_archetype(detail::dummy_constructor x) : Base(x) { } | ||
|  |   }; | ||
|  |   template <class Base> | ||
|  |   boolean_archetype | ||
|  |   operator<(const less_than_comparable_archetype<Base>&, | ||
|  |             const less_than_comparable_archetype<Base>&) | ||
|  |   { | ||
|  |     return boolean_archetype(static_object<detail::dummy_constructor>::get()); | ||
|  |   } | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  |   template <class Base = null_archetype<> > | ||
|  |   class comparable_archetype : public Base { | ||
|  |   public: | ||
|  |     comparable_archetype(detail::dummy_constructor x) : Base(x) { } | ||
|  |   }; | ||
|  |   template <class Base> | ||
|  |   boolean_archetype | ||
|  |   operator<(const comparable_archetype<Base>&, | ||
|  |             const comparable_archetype<Base>&) | ||
|  |   { | ||
|  |     return boolean_archetype(static_object<detail::dummy_constructor>::get()); | ||
|  |   } | ||
|  |   template <class Base> | ||
|  |   boolean_archetype | ||
|  |   operator<=(const comparable_archetype<Base>&, | ||
|  |              const comparable_archetype<Base>&) | ||
|  |   { | ||
|  |     return boolean_archetype(static_object<detail::dummy_constructor>::get()); | ||
|  |   } | ||
|  |   template <class Base> | ||
|  |   boolean_archetype | ||
|  |   operator>(const comparable_archetype<Base>&, | ||
|  |             const comparable_archetype<Base>&) | ||
|  |   { | ||
|  |     return boolean_archetype(static_object<detail::dummy_constructor>::get()); | ||
|  |   } | ||
|  |   template <class Base> | ||
|  |   boolean_archetype | ||
|  |   operator>=(const comparable_archetype<Base>&, | ||
|  |              const comparable_archetype<Base>&) | ||
|  |   { | ||
|  |     return boolean_archetype(static_object<detail::dummy_constructor>::get()); | ||
|  |   } | ||
|  | 
 | ||
|  | 
 | ||
|  |   // The purpose of the optags is so that one can specify | ||
|  |   // exactly which types the operator< is defined between. | ||
|  |   // This is useful for allowing the operations: | ||
|  |   // | ||
|  |   // A a; B b; | ||
|  |   // a < b | ||
|  |   // b < a | ||
|  |   // | ||
|  |   // without also allowing the combinations: | ||
|  |   // | ||
|  |   // a < a | ||
|  |   // b < b | ||
|  |   // | ||
|  |   struct optag1 { }; | ||
|  |   struct optag2 { }; | ||
|  |   struct optag3 { }; | ||
|  | 
 | ||
|  | #define BOOST_DEFINE_BINARY_PREDICATE_ARCHETYPE(OP, NAME)                       \ | ||
|  |   template <class Base = null_archetype<>, class Tag = optag1 >                 \ | ||
|  |   class NAME##_first_archetype : public Base {                                  \ | ||
|  |   public:                                                                       \ | ||
|  |     NAME##_first_archetype(detail::dummy_constructor x) : Base(x) { }           \ | ||
|  |   };                                                                            \ | ||
|  |                                                                                 \ | ||
|  |   template <class Base = null_archetype<>, class Tag = optag1 >                 \ | ||
|  |   class NAME##_second_archetype : public Base {                                 \ | ||
|  |   public:                                                                       \ | ||
|  |     NAME##_second_archetype(detail::dummy_constructor x) : Base(x) { }          \ | ||
|  |   };                                                                            \ | ||
|  |                                                                                 \ | ||
|  |   template <class BaseFirst, class BaseSecond, class Tag>                       \ | ||
|  |   boolean_archetype                                                             \ | ||
|  |   operator OP (const NAME##_first_archetype<BaseFirst, Tag>&,                   \ | ||
|  |                const NAME##_second_archetype<BaseSecond, Tag>&)                 \ | ||
|  |   {                                                                             \ | ||
|  |    return boolean_archetype(static_object<detail::dummy_constructor>::get());   \ | ||
|  |   } | ||
|  | 
 | ||
|  |   BOOST_DEFINE_BINARY_PREDICATE_ARCHETYPE(==, equal_op) | ||
|  |   BOOST_DEFINE_BINARY_PREDICATE_ARCHETYPE(!=, not_equal_op) | ||
|  |   BOOST_DEFINE_BINARY_PREDICATE_ARCHETYPE(<, less_than_op) | ||
|  |   BOOST_DEFINE_BINARY_PREDICATE_ARCHETYPE(<=, less_equal_op) | ||
|  |   BOOST_DEFINE_BINARY_PREDICATE_ARCHETYPE(>, greater_than_op) | ||
|  |   BOOST_DEFINE_BINARY_PREDICATE_ARCHETYPE(>=, greater_equal_op) | ||
|  | 
 | ||
|  | #define BOOST_DEFINE_OPERATOR_ARCHETYPE(OP, NAME) \ | ||
|  |   template <class Base = null_archetype<> > \ | ||
|  |   class NAME##_archetype : public Base { \ | ||
|  |   public: \ | ||
|  |     NAME##_archetype(detail::dummy_constructor x) : Base(x) { } \ | ||
|  |     NAME##_archetype(const NAME##_archetype&)  \ | ||
|  |       : Base(static_object<detail::dummy_constructor>::get()) { } \ | ||
|  |     NAME##_archetype& operator=(const NAME##_archetype&) { return *this; } \ | ||
|  |   }; \ | ||
|  |   template <class Base> \ | ||
|  |   NAME##_archetype<Base> \ | ||
|  |   operator OP (const NAME##_archetype<Base>&,\ | ||
|  |                const NAME##_archetype<Base>&)  \ | ||
|  |   { \ | ||
|  |     return \ | ||
|  |      NAME##_archetype<Base>(static_object<detail::dummy_constructor>::get()); \ | ||
|  |   } | ||
|  | 
 | ||
|  |   BOOST_DEFINE_OPERATOR_ARCHETYPE(+, addable) | ||
|  |   BOOST_DEFINE_OPERATOR_ARCHETYPE(-, subtractable) | ||
|  |   BOOST_DEFINE_OPERATOR_ARCHETYPE(*, multipliable) | ||
|  |   BOOST_DEFINE_OPERATOR_ARCHETYPE(/, dividable) | ||
|  |   BOOST_DEFINE_OPERATOR_ARCHETYPE(%, modable) | ||
|  | 
 | ||
|  |   // As is, these are useless because of the return type. | ||
|  |   // Need to invent a better way... | ||
|  | #define BOOST_DEFINE_BINARY_OPERATOR_ARCHETYPE(OP, NAME) \ | ||
|  |   template <class Return, class Base = null_archetype<> > \ | ||
|  |   class NAME##_first_archetype : public Base { \ | ||
|  |   public: \ | ||
|  |     NAME##_first_archetype(detail::dummy_constructor x) : Base(x) { } \ | ||
|  |   }; \ | ||
|  |   \ | ||
|  |   template <class Return, class Base = null_archetype<> > \ | ||
|  |   class NAME##_second_archetype : public Base { \ | ||
|  |   public: \ | ||
|  |     NAME##_second_archetype(detail::dummy_constructor x) : Base(x) { } \ | ||
|  |   }; \ | ||
|  |   \ | ||
|  |   template <class Return, class BaseFirst, class BaseSecond> \ | ||
|  |   Return \ | ||
|  |   operator OP (const NAME##_first_archetype<Return, BaseFirst>&, \ | ||
|  |                const NAME##_second_archetype<Return, BaseSecond>&) \ | ||
|  |   { \ | ||
|  |     return Return(static_object<detail::dummy_constructor>::get()); \ | ||
|  |   } | ||
|  | 
 | ||
|  |   BOOST_DEFINE_BINARY_OPERATOR_ARCHETYPE(+, plus_op) | ||
|  |   BOOST_DEFINE_BINARY_OPERATOR_ARCHETYPE(*, time_op) | ||
|  |   BOOST_DEFINE_BINARY_OPERATOR_ARCHETYPE(/, divide_op) | ||
|  |   BOOST_DEFINE_BINARY_OPERATOR_ARCHETYPE(-, subtract_op) | ||
|  |   BOOST_DEFINE_BINARY_OPERATOR_ARCHETYPE(%, mod_op) | ||
|  | 
 | ||
|  |   //=========================================================================== | ||
|  |   // Function Object Archetype Classes | ||
|  | 
 | ||
|  |   template <class Return> | ||
|  |   class generator_archetype { | ||
|  |   public: | ||
|  |     const Return& operator()() { | ||
|  |       return static_object<Return>::get();  | ||
|  |     } | ||
|  |   }; | ||
|  | 
 | ||
|  |   class void_generator_archetype { | ||
|  |   public: | ||
|  |     void operator()() { } | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <class Arg, class Return> | ||
|  |   class unary_function_archetype { | ||
|  |   private: | ||
|  |     unary_function_archetype() { } | ||
|  |   public: | ||
|  |     unary_function_archetype(detail::dummy_constructor) { } | ||
|  |     const Return& operator()(const Arg&) const { | ||
|  |       return static_object<Return>::get();  | ||
|  |     } | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <class Arg1, class Arg2, class Return> | ||
|  |   class binary_function_archetype { | ||
|  |   private: | ||
|  |     binary_function_archetype() { } | ||
|  |   public: | ||
|  |     binary_function_archetype(detail::dummy_constructor) { } | ||
|  |     const Return& operator()(const Arg1&, const Arg2&) const { | ||
|  |       return static_object<Return>::get();  | ||
|  |     } | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <class Arg> | ||
|  |   class unary_predicate_archetype { | ||
|  |     typedef boolean_archetype Return; | ||
|  |     unary_predicate_archetype() { } | ||
|  |   public: | ||
|  |     unary_predicate_archetype(detail::dummy_constructor) { } | ||
|  |     const Return& operator()(const Arg&) const { | ||
|  |       return static_object<Return>::get();  | ||
|  |     } | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <class Arg1, class Arg2, class Base = null_archetype<> > | ||
|  |   class binary_predicate_archetype { | ||
|  |     typedef boolean_archetype Return; | ||
|  |     binary_predicate_archetype() { } | ||
|  |   public: | ||
|  |     binary_predicate_archetype(detail::dummy_constructor) { } | ||
|  |     const Return& operator()(const Arg1&, const Arg2&) const { | ||
|  |       return static_object<Return>::get();  | ||
|  |     } | ||
|  |   }; | ||
|  | 
 | ||
|  |   //=========================================================================== | ||
|  |   // Iterator Archetype Classes | ||
|  | 
 | ||
|  |   template <class T, int I = 0> | ||
|  |   class input_iterator_archetype | ||
|  |   { | ||
|  |   private: | ||
|  |     typedef input_iterator_archetype self; | ||
|  |   public: | ||
|  |     typedef std::input_iterator_tag iterator_category; | ||
|  |     typedef T value_type; | ||
|  |     struct reference { | ||
|  |       operator const value_type&() const { return static_object<T>::get(); } | ||
|  |     }; | ||
|  |     typedef const T* pointer; | ||
|  |     typedef std::ptrdiff_t difference_type; | ||
|  |     self& operator=(const self&) { return *this;  } | ||
|  |     bool operator==(const self&) const { return true; } | ||
|  |     bool operator!=(const self&) const { return true; } | ||
|  |     reference operator*() const { return reference(); } | ||
|  |     self& operator++() { return *this; } | ||
|  |     self operator++(int) { return *this; } | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <class T> | ||
|  |   class input_iterator_archetype_no_proxy | ||
|  |   { | ||
|  |   private: | ||
|  |     typedef input_iterator_archetype_no_proxy self; | ||
|  |   public: | ||
|  |     typedef std::input_iterator_tag iterator_category; | ||
|  |     typedef T value_type; | ||
|  |     typedef const T& reference; | ||
|  |     typedef const T* pointer; | ||
|  |     typedef std::ptrdiff_t difference_type; | ||
|  |     self& operator=(const self&) { return *this;  } | ||
|  |     bool operator==(const self&) const { return true; } | ||
|  |     bool operator!=(const self&) const { return true; } | ||
|  |     reference operator*() const { return static_object<T>::get(); } | ||
|  |     self& operator++() { return *this; } | ||
|  |     self operator++(int) { return *this; } | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <class T> | ||
|  |   struct output_proxy { | ||
|  |     output_proxy& operator=(const T&) { return *this; } | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <class T> | ||
|  |   class output_iterator_archetype | ||
|  |   { | ||
|  |   public: | ||
|  |     typedef output_iterator_archetype self; | ||
|  |   public: | ||
|  |     typedef std::output_iterator_tag iterator_category; | ||
|  |     typedef output_proxy<T> value_type; | ||
|  |     typedef output_proxy<T> reference; | ||
|  |     typedef void pointer; | ||
|  |     typedef void difference_type; | ||
|  |     output_iterator_archetype(detail::dummy_constructor) { } | ||
|  |     output_iterator_archetype(const self&) { } | ||
|  |     self& operator=(const self&) { return *this; } | ||
|  |     bool operator==(const self&) const { return true; } | ||
|  |     bool operator!=(const self&) const { return true; } | ||
|  |     reference operator*() const { return output_proxy<T>(); } | ||
|  |     self& operator++() { return *this; } | ||
|  |     self operator++(int) { return *this; } | ||
|  |   private: | ||
|  |     output_iterator_archetype() { } | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <class T> | ||
|  |   class input_output_iterator_archetype | ||
|  |   { | ||
|  |   private: | ||
|  |     typedef input_output_iterator_archetype self; | ||
|  |     struct in_out_tag : public std::input_iterator_tag, public std::output_iterator_tag { }; | ||
|  |   public: | ||
|  |     typedef in_out_tag iterator_category; | ||
|  |     typedef T value_type; | ||
|  |     struct reference { | ||
|  |       reference& operator=(const T&) { return *this; } | ||
|  |       operator value_type() { return static_object<T>::get(); } | ||
|  |     }; | ||
|  |     typedef const T* pointer; | ||
|  |     typedef std::ptrdiff_t difference_type; | ||
|  |     input_output_iterator_archetype() { } | ||
|  |     self& operator=(const self&) { return *this;  } | ||
|  |     bool operator==(const self&) const { return true; } | ||
|  |     bool operator!=(const self&) const { return true; } | ||
|  |     reference operator*() const { return reference(); } | ||
|  |     self& operator++() { return *this; } | ||
|  |     self operator++(int) { return *this; } | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <class T> | ||
|  |   class forward_iterator_archetype | ||
|  |   { | ||
|  |   public: | ||
|  |     typedef forward_iterator_archetype self; | ||
|  |   public: | ||
|  |     typedef std::forward_iterator_tag iterator_category; | ||
|  |     typedef T value_type; | ||
|  |     typedef const T& reference; | ||
|  |     typedef T const* pointer; | ||
|  |     typedef std::ptrdiff_t difference_type; | ||
|  |     forward_iterator_archetype() { } | ||
|  |     self& operator=(const self&) { return *this;  } | ||
|  |     bool operator==(const self&) const { return true; } | ||
|  |     bool operator!=(const self&) const { return true; } | ||
|  |     reference operator*() const { return static_object<T>::get(); } | ||
|  |     self& operator++() { return *this; } | ||
|  |     self operator++(int) { return *this; } | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <class T> | ||
|  |   class mutable_forward_iterator_archetype | ||
|  |   { | ||
|  |   public: | ||
|  |     typedef mutable_forward_iterator_archetype self; | ||
|  |   public: | ||
|  |     typedef std::forward_iterator_tag iterator_category; | ||
|  |     typedef T value_type; | ||
|  |     typedef T& reference; | ||
|  |     typedef T* pointer; | ||
|  |     typedef std::ptrdiff_t difference_type; | ||
|  |     mutable_forward_iterator_archetype() { } | ||
|  |     self& operator=(const self&) { return *this;  } | ||
|  |     bool operator==(const self&) const { return true; } | ||
|  |     bool operator!=(const self&) const { return true; } | ||
|  |     reference operator*() const { return static_object<T>::get(); } | ||
|  |     self& operator++() { return *this; } | ||
|  |     self operator++(int) { return *this; } | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <class T> | ||
|  |   class bidirectional_iterator_archetype | ||
|  |   { | ||
|  |   public: | ||
|  |     typedef bidirectional_iterator_archetype self; | ||
|  |   public: | ||
|  |     typedef std::bidirectional_iterator_tag iterator_category; | ||
|  |     typedef T value_type; | ||
|  |     typedef const T& reference; | ||
|  |     typedef T* pointer; | ||
|  |     typedef std::ptrdiff_t difference_type; | ||
|  |     bidirectional_iterator_archetype() { } | ||
|  |     self& operator=(const self&) { return *this;  } | ||
|  |     bool operator==(const self&) const { return true; } | ||
|  |     bool operator!=(const self&) const { return true; } | ||
|  |     reference operator*() const { return static_object<T>::get(); } | ||
|  |     self& operator++() { return *this; } | ||
|  |     self operator++(int) { return *this; } | ||
|  |     self& operator--() { return *this; } | ||
|  |     self operator--(int) { return *this; } | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <class T> | ||
|  |   class mutable_bidirectional_iterator_archetype | ||
|  |   { | ||
|  |   public: | ||
|  |     typedef mutable_bidirectional_iterator_archetype self; | ||
|  |   public: | ||
|  |     typedef std::bidirectional_iterator_tag iterator_category; | ||
|  |     typedef T value_type; | ||
|  |     typedef T& reference; | ||
|  |     typedef T* pointer; | ||
|  |     typedef std::ptrdiff_t difference_type; | ||
|  |     mutable_bidirectional_iterator_archetype() { } | ||
|  |     self& operator=(const self&) { return *this;  } | ||
|  |     bool operator==(const self&) const { return true; } | ||
|  |     bool operator!=(const self&) const { return true; } | ||
|  |     reference operator*() const { return static_object<T>::get(); } | ||
|  |     self& operator++() { return *this; } | ||
|  |     self operator++(int) { return *this; } | ||
|  |     self& operator--() { return *this; } | ||
|  |     self operator--(int) { return *this; } | ||
|  |   }; | ||
|  | 
 | ||
|  |   template <class T> | ||
|  |   class random_access_iterator_archetype | ||
|  |   { | ||
|  |   public: | ||
|  |     typedef random_access_iterator_archetype self; | ||
|  |   public: | ||
|  |     typedef std::random_access_iterator_tag iterator_category; | ||
|  |     typedef T value_type; | ||
|  |     typedef const T& reference; | ||
|  |     typedef T* pointer; | ||
|  |     typedef std::ptrdiff_t difference_type; | ||
|  |     random_access_iterator_archetype() { } | ||
|  |     self& operator=(const self&) { return *this;  } | ||
|  |     bool operator==(const self&) const { return true; } | ||
|  |     bool operator!=(const self&) const { return true; } | ||
|  |     reference operator*() const { return static_object<T>::get(); } | ||
|  |     self& operator++() { return *this; } | ||
|  |     self operator++(int) { return *this; } | ||
|  |     self& operator--() { return *this; } | ||
|  |     self operator--(int) { return *this; } | ||
|  |     reference operator[](difference_type) const | ||
|  |       { return static_object<T>::get(); } | ||
|  |     self& operator+=(difference_type) { return *this; } | ||
|  |     self& operator-=(difference_type) { return *this; } | ||
|  |     difference_type operator-(const self&) const | ||
|  |       { return difference_type(); } | ||
|  |     self operator+(difference_type) const { return *this; } | ||
|  |     self operator-(difference_type) const { return *this; } | ||
|  |     bool operator<(const self&) const { return true; } | ||
|  |     bool operator<=(const self&) const { return true; } | ||
|  |     bool operator>(const self&) const { return true; } | ||
|  |     bool operator>=(const self&) const { return true; } | ||
|  |   }; | ||
|  |   template <class T> | ||
|  |   random_access_iterator_archetype<T>  | ||
|  |   operator+(typename random_access_iterator_archetype<T>::difference_type,  | ||
|  |             const random_access_iterator_archetype<T>& x)  | ||
|  |     { return x; } | ||
|  | 
 | ||
|  | 
 | ||
|  |   template <class T> | ||
|  |   class mutable_random_access_iterator_archetype | ||
|  |   { | ||
|  |   public: | ||
|  |     typedef mutable_random_access_iterator_archetype self; | ||
|  |   public: | ||
|  |     typedef std::random_access_iterator_tag iterator_category; | ||
|  |     typedef T value_type; | ||
|  |     typedef T& reference; | ||
|  |     typedef T* pointer; | ||
|  |     typedef std::ptrdiff_t difference_type; | ||
|  |     mutable_random_access_iterator_archetype() { } | ||
|  |     self& operator=(const self&) { return *this;  } | ||
|  |     bool operator==(const self&) const { return true; } | ||
|  |     bool operator!=(const self&) const { return true; } | ||
|  |     reference operator*() const { return static_object<T>::get(); } | ||
|  |     self& operator++() { return *this; } | ||
|  |     self operator++(int) { return *this; } | ||
|  |     self& operator--() { return *this; } | ||
|  |     self operator--(int) { return *this; } | ||
|  |     reference operator[](difference_type) const | ||
|  |       { return static_object<T>::get(); } | ||
|  |     self& operator+=(difference_type) { return *this; } | ||
|  |     self& operator-=(difference_type) { return *this; } | ||
|  |     difference_type operator-(const self&) const | ||
|  |       { return difference_type(); } | ||
|  |     self operator+(difference_type) const { return *this; } | ||
|  |     self operator-(difference_type) const { return *this; } | ||
|  |     bool operator<(const self&) const { return true; } | ||
|  |     bool operator<=(const self&) const { return true; } | ||
|  |     bool operator>(const self&) const { return true; } | ||
|  |     bool operator>=(const self&) const { return true; } | ||
|  |   }; | ||
|  |   template <class T> | ||
|  |   mutable_random_access_iterator_archetype<T>  | ||
|  |   operator+ | ||
|  |     (typename mutable_random_access_iterator_archetype<T>::difference_type,  | ||
|  |      const mutable_random_access_iterator_archetype<T>& x)  | ||
|  |     { return x; } | ||
|  | 
 | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | #endif // BOOST_CONCEPT_ARCHETYPES_H |