ossrv_pub/boost_apis/boost/concept_archetype.hpp
changeset 0 e4d67989cc36
equal deleted inserted replaced
-1:000000000000 0:e4d67989cc36
       
     1 //
       
     2 // (C) Copyright Jeremy Siek 2000.
       
     3 // Distributed under the Boost Software License, Version 1.0. (See
       
     4 // accompanying file LICENSE_1_0.txt or copy at
       
     5 // http://www.boost.org/LICENSE_1_0.txt)
       
     6 //
       
     7 // Revision History:
       
     8 //
       
     9 //   17 July  2001: Added const to some member functions. (Jeremy Siek) 
       
    10 //   05 May   2001: Removed static dummy_cons object. (Jeremy Siek)
       
    11 
       
    12 // See http://www.boost.org/libs/concept_check for documentation.
       
    13 
       
    14 #ifndef BOOST_CONCEPT_ARCHETYPES_HPP
       
    15 #define BOOST_CONCEPT_ARCHETYPES_HPP
       
    16 
       
    17 #include <boost/config.hpp>
       
    18 #include <boost/iterator.hpp>
       
    19 #include <boost/mpl/identity.hpp>
       
    20 #include <functional>
       
    21 
       
    22 namespace boost {
       
    23 
       
    24   //===========================================================================
       
    25   // Basic Archetype Classes
       
    26 
       
    27   namespace detail {
       
    28     class dummy_constructor { };
       
    29   }
       
    30 
       
    31   // A type that models no concept. The template parameter 
       
    32   // is only there so that null_archetype types can be created
       
    33   // that have different type.
       
    34   template <class T = int>
       
    35   class null_archetype {
       
    36   private:
       
    37     null_archetype() { }
       
    38     null_archetype(const null_archetype&) { }
       
    39     null_archetype& operator=(const null_archetype&) { return *this; }
       
    40   public:
       
    41     null_archetype(detail::dummy_constructor) { }
       
    42 #ifndef __MWERKS__
       
    43     template <class TT>
       
    44     friend void dummy_friend(); // just to avoid warnings
       
    45 #endif
       
    46   };
       
    47 
       
    48   // This is a helper class that provides a way to get a reference to
       
    49   // an object. The get() function will never be called at run-time
       
    50   // (nothing in this file will) so this seemingly very bad function
       
    51   // is really quite innocent. The name of this class needs to be
       
    52   // changed.
       
    53   template <class T>
       
    54   class static_object
       
    55   {
       
    56   public:
       
    57       static T& get()
       
    58       {
       
    59 #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
       
    60           return *reinterpret_cast<T*>(0);
       
    61 #else 
       
    62           static char d[sizeof(T)];
       
    63           return *reinterpret_cast<T*>(d);
       
    64 #endif 
       
    65       }
       
    66   };
       
    67 
       
    68   template <class Base = null_archetype<> >
       
    69   class default_constructible_archetype : public Base {
       
    70   public:
       
    71     default_constructible_archetype() 
       
    72       : Base(static_object<detail::dummy_constructor>::get()) { }
       
    73     default_constructible_archetype(detail::dummy_constructor x) : Base(x) { }
       
    74   };
       
    75 
       
    76   template <class Base = null_archetype<> >
       
    77   class assignable_archetype : public Base {
       
    78     assignable_archetype() { }
       
    79     assignable_archetype(const assignable_archetype&) { }
       
    80   public:
       
    81     assignable_archetype& operator=(const assignable_archetype&) {
       
    82       return *this;
       
    83     }
       
    84     assignable_archetype(detail::dummy_constructor x) : Base(x) { }
       
    85   };
       
    86 
       
    87   template <class Base = null_archetype<> >
       
    88   class copy_constructible_archetype : public Base {
       
    89   public:
       
    90     copy_constructible_archetype() 
       
    91       : Base(static_object<detail::dummy_constructor>::get()) { }
       
    92     copy_constructible_archetype(const copy_constructible_archetype&)
       
    93       : Base(static_object<detail::dummy_constructor>::get()) { }
       
    94     copy_constructible_archetype(detail::dummy_constructor x) : Base(x) { }
       
    95   };
       
    96 
       
    97   template <class Base = null_archetype<> >
       
    98   class sgi_assignable_archetype : public Base {
       
    99   public:
       
   100     sgi_assignable_archetype(const sgi_assignable_archetype&)
       
   101       : Base(static_object<detail::dummy_constructor>::get()) { }
       
   102     sgi_assignable_archetype& operator=(const sgi_assignable_archetype&) {
       
   103       return *this;
       
   104     }
       
   105     sgi_assignable_archetype(const detail::dummy_constructor& x) : Base(x) { }
       
   106   };
       
   107 
       
   108   struct default_archetype_base {
       
   109     default_archetype_base(detail::dummy_constructor) { }
       
   110   };
       
   111 
       
   112   // Careful, don't use same type for T and Base. That results in the
       
   113   // conversion operator being invalid.  Since T is often
       
   114   // null_archetype, can't use null_archetype for Base.
       
   115   template <class T, class Base = default_archetype_base>
       
   116   class convertible_to_archetype : public Base {
       
   117   private:
       
   118     convertible_to_archetype() { }
       
   119     convertible_to_archetype(const convertible_to_archetype& ) { }
       
   120     convertible_to_archetype& operator=(const convertible_to_archetype&)
       
   121       { return *this; }
       
   122   public:
       
   123     convertible_to_archetype(detail::dummy_constructor x) : Base(x) { }
       
   124     operator const T&() const { return static_object<T>::get(); }
       
   125   };
       
   126 
       
   127   template <class T, class Base = default_archetype_base>
       
   128   class convertible_from_archetype : public Base {
       
   129   private:
       
   130     convertible_from_archetype() { }
       
   131     convertible_from_archetype(const convertible_from_archetype& ) { }
       
   132     convertible_from_archetype& operator=(const convertible_from_archetype&)
       
   133       { return *this; }
       
   134   public:
       
   135     convertible_from_archetype(detail::dummy_constructor x) : Base(x) { }
       
   136     convertible_from_archetype(const T&) { }
       
   137     convertible_from_archetype& operator=(const T&)
       
   138       { return *this; }
       
   139   };
       
   140 
       
   141   class boolean_archetype {
       
   142   public:
       
   143     boolean_archetype(const boolean_archetype&) { }
       
   144     operator bool() const { return true; }
       
   145     boolean_archetype(detail::dummy_constructor) { }
       
   146   private:
       
   147     boolean_archetype() { }
       
   148     boolean_archetype& operator=(const boolean_archetype&) { return *this; }
       
   149   };
       
   150   
       
   151   template <class Base = null_archetype<> >
       
   152   class equality_comparable_archetype : public Base {
       
   153   public:
       
   154     equality_comparable_archetype(detail::dummy_constructor x) : Base(x) { }
       
   155   };
       
   156   template <class Base>
       
   157   boolean_archetype
       
   158   operator==(const equality_comparable_archetype<Base>&,
       
   159              const equality_comparable_archetype<Base>&) 
       
   160   { 
       
   161     return boolean_archetype(static_object<detail::dummy_constructor>::get());
       
   162   }
       
   163   template <class Base>
       
   164   boolean_archetype
       
   165   operator!=(const equality_comparable_archetype<Base>&,
       
   166              const equality_comparable_archetype<Base>&)
       
   167   {
       
   168     return boolean_archetype(static_object<detail::dummy_constructor>::get());
       
   169   }
       
   170 
       
   171 
       
   172   template <class Base = null_archetype<> >
       
   173   class equality_comparable2_first_archetype : public Base {
       
   174   public:
       
   175     equality_comparable2_first_archetype(detail::dummy_constructor x) 
       
   176       : Base(x) { }
       
   177   };
       
   178   template <class Base = null_archetype<> >
       
   179   class equality_comparable2_second_archetype : public Base {
       
   180   public:
       
   181     equality_comparable2_second_archetype(detail::dummy_constructor x) 
       
   182       : Base(x) { }
       
   183   };
       
   184   template <class Base1, class Base2>
       
   185   boolean_archetype
       
   186   operator==(const equality_comparable2_first_archetype<Base1>&,
       
   187              const equality_comparable2_second_archetype<Base2>&) 
       
   188   {
       
   189     return boolean_archetype(static_object<detail::dummy_constructor>::get());
       
   190   }
       
   191   template <class Base1, class Base2>
       
   192   boolean_archetype
       
   193   operator!=(const equality_comparable2_first_archetype<Base1>&,
       
   194              const equality_comparable2_second_archetype<Base2>&)
       
   195   {
       
   196     return boolean_archetype(static_object<detail::dummy_constructor>::get());
       
   197   }
       
   198 
       
   199 
       
   200   template <class Base = null_archetype<> >
       
   201   class less_than_comparable_archetype : public Base {
       
   202   public:
       
   203     less_than_comparable_archetype(detail::dummy_constructor x) : Base(x) { }
       
   204   };
       
   205   template <class Base>
       
   206   boolean_archetype
       
   207   operator<(const less_than_comparable_archetype<Base>&,
       
   208             const less_than_comparable_archetype<Base>&)
       
   209   {
       
   210     return boolean_archetype(static_object<detail::dummy_constructor>::get());
       
   211   }
       
   212 
       
   213 
       
   214 
       
   215   template <class Base = null_archetype<> >
       
   216   class comparable_archetype : public Base {
       
   217   public:
       
   218     comparable_archetype(detail::dummy_constructor x) : Base(x) { }
       
   219   };
       
   220   template <class Base>
       
   221   boolean_archetype
       
   222   operator<(const comparable_archetype<Base>&,
       
   223             const comparable_archetype<Base>&)
       
   224   {
       
   225     return boolean_archetype(static_object<detail::dummy_constructor>::get());
       
   226   }
       
   227   template <class Base>
       
   228   boolean_archetype
       
   229   operator<=(const comparable_archetype<Base>&,
       
   230              const comparable_archetype<Base>&)
       
   231   {
       
   232     return boolean_archetype(static_object<detail::dummy_constructor>::get());
       
   233   }
       
   234   template <class Base>
       
   235   boolean_archetype
       
   236   operator>(const comparable_archetype<Base>&,
       
   237             const comparable_archetype<Base>&)
       
   238   {
       
   239     return boolean_archetype(static_object<detail::dummy_constructor>::get());
       
   240   }
       
   241   template <class Base>
       
   242   boolean_archetype
       
   243   operator>=(const comparable_archetype<Base>&,
       
   244              const comparable_archetype<Base>&)
       
   245   {
       
   246     return boolean_archetype(static_object<detail::dummy_constructor>::get());
       
   247   }
       
   248 
       
   249 
       
   250   // The purpose of the optags is so that one can specify
       
   251   // exactly which types the operator< is defined between.
       
   252   // This is useful for allowing the operations:
       
   253   //
       
   254   // A a; B b;
       
   255   // a < b
       
   256   // b < a
       
   257   //
       
   258   // without also allowing the combinations:
       
   259   //
       
   260   // a < a
       
   261   // b < b
       
   262   //
       
   263   struct optag1 { };
       
   264   struct optag2 { };
       
   265   struct optag3 { };
       
   266 
       
   267 #define BOOST_DEFINE_BINARY_PREDICATE_ARCHETYPE(OP, NAME)                       \
       
   268   template <class Base = null_archetype<>, class Tag = optag1 >                 \
       
   269   class NAME##_first_archetype : public Base {                                  \
       
   270   public:                                                                       \
       
   271     NAME##_first_archetype(detail::dummy_constructor x) : Base(x) { }           \
       
   272   };                                                                            \
       
   273                                                                                 \
       
   274   template <class Base = null_archetype<>, class Tag = optag1 >                 \
       
   275   class NAME##_second_archetype : public Base {                                 \
       
   276   public:                                                                       \
       
   277     NAME##_second_archetype(detail::dummy_constructor x) : Base(x) { }          \
       
   278   };                                                                            \
       
   279                                                                                 \
       
   280   template <class BaseFirst, class BaseSecond, class Tag>                       \
       
   281   boolean_archetype                                                             \
       
   282   operator OP (const NAME##_first_archetype<BaseFirst, Tag>&,                   \
       
   283                const NAME##_second_archetype<BaseSecond, Tag>&)                 \
       
   284   {                                                                             \
       
   285    return boolean_archetype(static_object<detail::dummy_constructor>::get());   \
       
   286   }
       
   287 
       
   288   BOOST_DEFINE_BINARY_PREDICATE_ARCHETYPE(==, equal_op)
       
   289   BOOST_DEFINE_BINARY_PREDICATE_ARCHETYPE(!=, not_equal_op)
       
   290   BOOST_DEFINE_BINARY_PREDICATE_ARCHETYPE(<, less_than_op)
       
   291   BOOST_DEFINE_BINARY_PREDICATE_ARCHETYPE(<=, less_equal_op)
       
   292   BOOST_DEFINE_BINARY_PREDICATE_ARCHETYPE(>, greater_than_op)
       
   293   BOOST_DEFINE_BINARY_PREDICATE_ARCHETYPE(>=, greater_equal_op)
       
   294 
       
   295 #define BOOST_DEFINE_OPERATOR_ARCHETYPE(OP, NAME) \
       
   296   template <class Base = null_archetype<> > \
       
   297   class NAME##_archetype : public Base { \
       
   298   public: \
       
   299     NAME##_archetype(detail::dummy_constructor x) : Base(x) { } \
       
   300     NAME##_archetype(const NAME##_archetype&)  \
       
   301       : Base(static_object<detail::dummy_constructor>::get()) { } \
       
   302     NAME##_archetype& operator=(const NAME##_archetype&) { return *this; } \
       
   303   }; \
       
   304   template <class Base> \
       
   305   NAME##_archetype<Base> \
       
   306   operator OP (const NAME##_archetype<Base>&,\
       
   307                const NAME##_archetype<Base>&)  \
       
   308   { \
       
   309     return \
       
   310      NAME##_archetype<Base>(static_object<detail::dummy_constructor>::get()); \
       
   311   }
       
   312 
       
   313   BOOST_DEFINE_OPERATOR_ARCHETYPE(+, addable)
       
   314   BOOST_DEFINE_OPERATOR_ARCHETYPE(-, subtractable)
       
   315   BOOST_DEFINE_OPERATOR_ARCHETYPE(*, multipliable)
       
   316   BOOST_DEFINE_OPERATOR_ARCHETYPE(/, dividable)
       
   317   BOOST_DEFINE_OPERATOR_ARCHETYPE(%, modable)
       
   318 
       
   319   // As is, these are useless because of the return type.
       
   320   // Need to invent a better way...
       
   321 #define BOOST_DEFINE_BINARY_OPERATOR_ARCHETYPE(OP, NAME) \
       
   322   template <class Return, class Base = null_archetype<> > \
       
   323   class NAME##_first_archetype : public Base { \
       
   324   public: \
       
   325     NAME##_first_archetype(detail::dummy_constructor x) : Base(x) { } \
       
   326   }; \
       
   327   \
       
   328   template <class Return, class Base = null_archetype<> > \
       
   329   class NAME##_second_archetype : public Base { \
       
   330   public: \
       
   331     NAME##_second_archetype(detail::dummy_constructor x) : Base(x) { } \
       
   332   }; \
       
   333   \
       
   334   template <class Return, class BaseFirst, class BaseSecond> \
       
   335   Return \
       
   336   operator OP (const NAME##_first_archetype<Return, BaseFirst>&, \
       
   337                const NAME##_second_archetype<Return, BaseSecond>&) \
       
   338   { \
       
   339     return Return(static_object<detail::dummy_constructor>::get()); \
       
   340   }
       
   341 
       
   342   BOOST_DEFINE_BINARY_OPERATOR_ARCHETYPE(+, plus_op)
       
   343   BOOST_DEFINE_BINARY_OPERATOR_ARCHETYPE(*, time_op)
       
   344   BOOST_DEFINE_BINARY_OPERATOR_ARCHETYPE(/, divide_op)
       
   345   BOOST_DEFINE_BINARY_OPERATOR_ARCHETYPE(-, subtract_op)
       
   346   BOOST_DEFINE_BINARY_OPERATOR_ARCHETYPE(%, mod_op)
       
   347 
       
   348   //===========================================================================
       
   349   // Function Object Archetype Classes
       
   350 
       
   351   template <class Return>
       
   352   class generator_archetype {
       
   353   public:
       
   354     const Return& operator()() {
       
   355       return static_object<Return>::get(); 
       
   356     }
       
   357   };
       
   358 
       
   359   class void_generator_archetype {
       
   360   public:
       
   361     void operator()() { }
       
   362   };
       
   363 
       
   364   template <class Arg, class Return>
       
   365   class unary_function_archetype {
       
   366   private:
       
   367     unary_function_archetype() { }
       
   368   public:
       
   369     unary_function_archetype(detail::dummy_constructor) { }
       
   370     const Return& operator()(const Arg&) const {
       
   371       return static_object<Return>::get(); 
       
   372     }
       
   373   };
       
   374 
       
   375   template <class Arg1, class Arg2, class Return>
       
   376   class binary_function_archetype {
       
   377   private:
       
   378     binary_function_archetype() { }
       
   379   public:
       
   380     binary_function_archetype(detail::dummy_constructor) { }
       
   381     const Return& operator()(const Arg1&, const Arg2&) const {
       
   382       return static_object<Return>::get(); 
       
   383     }
       
   384   };
       
   385 
       
   386   template <class Arg>
       
   387   class unary_predicate_archetype {
       
   388     typedef boolean_archetype Return;
       
   389     unary_predicate_archetype() { }
       
   390   public:
       
   391     unary_predicate_archetype(detail::dummy_constructor) { }
       
   392     const Return& operator()(const Arg&) const {
       
   393       return static_object<Return>::get(); 
       
   394     }
       
   395   };
       
   396 
       
   397   template <class Arg1, class Arg2, class Base = null_archetype<> >
       
   398   class binary_predicate_archetype {
       
   399     typedef boolean_archetype Return;
       
   400     binary_predicate_archetype() { }
       
   401   public:
       
   402     binary_predicate_archetype(detail::dummy_constructor) { }
       
   403     const Return& operator()(const Arg1&, const Arg2&) const {
       
   404       return static_object<Return>::get(); 
       
   405     }
       
   406   };
       
   407 
       
   408   //===========================================================================
       
   409   // Iterator Archetype Classes
       
   410 
       
   411   template <class T, int I = 0>
       
   412   class input_iterator_archetype
       
   413   {
       
   414   private:
       
   415     typedef input_iterator_archetype self;
       
   416   public:
       
   417     typedef std::input_iterator_tag iterator_category;
       
   418     typedef T value_type;
       
   419     struct reference {
       
   420       operator const value_type&() const { return static_object<T>::get(); }
       
   421     };
       
   422     typedef const T* pointer;
       
   423     typedef std::ptrdiff_t difference_type;
       
   424     self& operator=(const self&) { return *this;  }
       
   425     bool operator==(const self&) const { return true; }
       
   426     bool operator!=(const self&) const { return true; }
       
   427     reference operator*() const { return reference(); }
       
   428     self& operator++() { return *this; }
       
   429     self operator++(int) { return *this; }
       
   430   };
       
   431 
       
   432   template <class T>
       
   433   class input_iterator_archetype_no_proxy
       
   434   {
       
   435   private:
       
   436     typedef input_iterator_archetype_no_proxy self;
       
   437   public:
       
   438     typedef std::input_iterator_tag iterator_category;
       
   439     typedef T value_type;
       
   440     typedef const T& reference;
       
   441     typedef const T* pointer;
       
   442     typedef std::ptrdiff_t difference_type;
       
   443     self& operator=(const self&) { return *this;  }
       
   444     bool operator==(const self&) const { return true; }
       
   445     bool operator!=(const self&) const { return true; }
       
   446     reference operator*() const { return static_object<T>::get(); }
       
   447     self& operator++() { return *this; }
       
   448     self operator++(int) { return *this; }
       
   449   };
       
   450 
       
   451   template <class T>
       
   452   struct output_proxy {
       
   453     output_proxy& operator=(const T&) { return *this; }
       
   454   };
       
   455 
       
   456   template <class T>
       
   457   class output_iterator_archetype
       
   458   {
       
   459   public:
       
   460     typedef output_iterator_archetype self;
       
   461   public:
       
   462     typedef std::output_iterator_tag iterator_category;
       
   463     typedef output_proxy<T> value_type;
       
   464     typedef output_proxy<T> reference;
       
   465     typedef void pointer;
       
   466     typedef void difference_type;
       
   467     output_iterator_archetype(detail::dummy_constructor) { }
       
   468     output_iterator_archetype(const self&) { }
       
   469     self& operator=(const self&) { return *this; }
       
   470     bool operator==(const self&) const { return true; }
       
   471     bool operator!=(const self&) const { return true; }
       
   472     reference operator*() const { return output_proxy<T>(); }
       
   473     self& operator++() { return *this; }
       
   474     self operator++(int) { return *this; }
       
   475   private:
       
   476     output_iterator_archetype() { }
       
   477   };
       
   478 
       
   479   template <class T>
       
   480   class input_output_iterator_archetype
       
   481   {
       
   482   private:
       
   483     typedef input_output_iterator_archetype self;
       
   484     struct in_out_tag : public std::input_iterator_tag, public std::output_iterator_tag { };
       
   485   public:
       
   486     typedef in_out_tag iterator_category;
       
   487     typedef T value_type;
       
   488     struct reference {
       
   489       reference& operator=(const T&) { return *this; }
       
   490       operator value_type() { return static_object<T>::get(); }
       
   491     };
       
   492     typedef const T* pointer;
       
   493     typedef std::ptrdiff_t difference_type;
       
   494     input_output_iterator_archetype() { }
       
   495     self& operator=(const self&) { return *this;  }
       
   496     bool operator==(const self&) const { return true; }
       
   497     bool operator!=(const self&) const { return true; }
       
   498     reference operator*() const { return reference(); }
       
   499     self& operator++() { return *this; }
       
   500     self operator++(int) { return *this; }
       
   501   };
       
   502 
       
   503   template <class T>
       
   504   class forward_iterator_archetype
       
   505   {
       
   506   public:
       
   507     typedef forward_iterator_archetype self;
       
   508   public:
       
   509     typedef std::forward_iterator_tag iterator_category;
       
   510     typedef T value_type;
       
   511     typedef const T& reference;
       
   512     typedef T const* pointer;
       
   513     typedef std::ptrdiff_t difference_type;
       
   514     forward_iterator_archetype() { }
       
   515     self& operator=(const self&) { return *this;  }
       
   516     bool operator==(const self&) const { return true; }
       
   517     bool operator!=(const self&) const { return true; }
       
   518     reference operator*() const { return static_object<T>::get(); }
       
   519     self& operator++() { return *this; }
       
   520     self operator++(int) { return *this; }
       
   521   };
       
   522 
       
   523   template <class T>
       
   524   class mutable_forward_iterator_archetype
       
   525   {
       
   526   public:
       
   527     typedef mutable_forward_iterator_archetype self;
       
   528   public:
       
   529     typedef std::forward_iterator_tag iterator_category;
       
   530     typedef T value_type;
       
   531     typedef T& reference;
       
   532     typedef T* pointer;
       
   533     typedef std::ptrdiff_t difference_type;
       
   534     mutable_forward_iterator_archetype() { }
       
   535     self& operator=(const self&) { return *this;  }
       
   536     bool operator==(const self&) const { return true; }
       
   537     bool operator!=(const self&) const { return true; }
       
   538     reference operator*() const { return static_object<T>::get(); }
       
   539     self& operator++() { return *this; }
       
   540     self operator++(int) { return *this; }
       
   541   };
       
   542 
       
   543   template <class T>
       
   544   class bidirectional_iterator_archetype
       
   545   {
       
   546   public:
       
   547     typedef bidirectional_iterator_archetype self;
       
   548   public:
       
   549     typedef std::bidirectional_iterator_tag iterator_category;
       
   550     typedef T value_type;
       
   551     typedef const T& reference;
       
   552     typedef T* pointer;
       
   553     typedef std::ptrdiff_t difference_type;
       
   554     bidirectional_iterator_archetype() { }
       
   555     self& operator=(const self&) { return *this;  }
       
   556     bool operator==(const self&) const { return true; }
       
   557     bool operator!=(const self&) const { return true; }
       
   558     reference operator*() const { return static_object<T>::get(); }
       
   559     self& operator++() { return *this; }
       
   560     self operator++(int) { return *this; }
       
   561     self& operator--() { return *this; }
       
   562     self operator--(int) { return *this; }
       
   563   };
       
   564 
       
   565   template <class T>
       
   566   class mutable_bidirectional_iterator_archetype
       
   567   {
       
   568   public:
       
   569     typedef mutable_bidirectional_iterator_archetype self;
       
   570   public:
       
   571     typedef std::bidirectional_iterator_tag iterator_category;
       
   572     typedef T value_type;
       
   573     typedef T& reference;
       
   574     typedef T* pointer;
       
   575     typedef std::ptrdiff_t difference_type;
       
   576     mutable_bidirectional_iterator_archetype() { }
       
   577     self& operator=(const self&) { return *this;  }
       
   578     bool operator==(const self&) const { return true; }
       
   579     bool operator!=(const self&) const { return true; }
       
   580     reference operator*() const { return static_object<T>::get(); }
       
   581     self& operator++() { return *this; }
       
   582     self operator++(int) { return *this; }
       
   583     self& operator--() { return *this; }
       
   584     self operator--(int) { return *this; }
       
   585   };
       
   586 
       
   587   template <class T>
       
   588   class random_access_iterator_archetype
       
   589   {
       
   590   public:
       
   591     typedef random_access_iterator_archetype self;
       
   592   public:
       
   593     typedef std::random_access_iterator_tag iterator_category;
       
   594     typedef T value_type;
       
   595     typedef const T& reference;
       
   596     typedef T* pointer;
       
   597     typedef std::ptrdiff_t difference_type;
       
   598     random_access_iterator_archetype() { }
       
   599     self& operator=(const self&) { return *this;  }
       
   600     bool operator==(const self&) const { return true; }
       
   601     bool operator!=(const self&) const { return true; }
       
   602     reference operator*() const { return static_object<T>::get(); }
       
   603     self& operator++() { return *this; }
       
   604     self operator++(int) { return *this; }
       
   605     self& operator--() { return *this; }
       
   606     self operator--(int) { return *this; }
       
   607     reference operator[](difference_type) const
       
   608       { return static_object<T>::get(); }
       
   609     self& operator+=(difference_type) { return *this; }
       
   610     self& operator-=(difference_type) { return *this; }
       
   611     difference_type operator-(const self&) const
       
   612       { return difference_type(); }
       
   613     self operator+(difference_type) const { return *this; }
       
   614     self operator-(difference_type) const { return *this; }
       
   615     bool operator<(const self&) const { return true; }
       
   616     bool operator<=(const self&) const { return true; }
       
   617     bool operator>(const self&) const { return true; }
       
   618     bool operator>=(const self&) const { return true; }
       
   619   };
       
   620   template <class T>
       
   621   random_access_iterator_archetype<T> 
       
   622   operator+(typename random_access_iterator_archetype<T>::difference_type, 
       
   623             const random_access_iterator_archetype<T>& x) 
       
   624     { return x; }
       
   625 
       
   626 
       
   627   template <class T>
       
   628   class mutable_random_access_iterator_archetype
       
   629   {
       
   630   public:
       
   631     typedef mutable_random_access_iterator_archetype self;
       
   632   public:
       
   633     typedef std::random_access_iterator_tag iterator_category;
       
   634     typedef T value_type;
       
   635     typedef T& reference;
       
   636     typedef T* pointer;
       
   637     typedef std::ptrdiff_t difference_type;
       
   638     mutable_random_access_iterator_archetype() { }
       
   639     self& operator=(const self&) { return *this;  }
       
   640     bool operator==(const self&) const { return true; }
       
   641     bool operator!=(const self&) const { return true; }
       
   642     reference operator*() const { return static_object<T>::get(); }
       
   643     self& operator++() { return *this; }
       
   644     self operator++(int) { return *this; }
       
   645     self& operator--() { return *this; }
       
   646     self operator--(int) { return *this; }
       
   647     reference operator[](difference_type) const
       
   648       { return static_object<T>::get(); }
       
   649     self& operator+=(difference_type) { return *this; }
       
   650     self& operator-=(difference_type) { return *this; }
       
   651     difference_type operator-(const self&) const
       
   652       { return difference_type(); }
       
   653     self operator+(difference_type) const { return *this; }
       
   654     self operator-(difference_type) const { return *this; }
       
   655     bool operator<(const self&) const { return true; }
       
   656     bool operator<=(const self&) const { return true; }
       
   657     bool operator>(const self&) const { return true; }
       
   658     bool operator>=(const self&) const { return true; }
       
   659   };
       
   660   template <class T>
       
   661   mutable_random_access_iterator_archetype<T> 
       
   662   operator+
       
   663     (typename mutable_random_access_iterator_archetype<T>::difference_type, 
       
   664      const mutable_random_access_iterator_archetype<T>& x) 
       
   665     { return x; }
       
   666 
       
   667 } // namespace boost
       
   668 
       
   669 #endif // BOOST_CONCEPT_ARCHETYPES_H