Whole document tree
    

Whole document tree

container_concepts.h Source File
Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  

container_concepts.h

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 1999
00003  * Silicon Graphics Computer Systems, Inc.
00004  *
00005  * Permission to use, copy, modify, distribute and sell this software
00006  * and its documentation for any purpose is hereby granted without fee,
00007  * provided that the above copyright notice appear in all copies and
00008  * that both that copyright notice and this permission notice appear
00009  * in supporting documentation.  Silicon Graphics makes no
00010  * representations about the suitability of this software for any
00011  * purpose.  It is provided "as is" without express or implied warranty.
00012  */
00013 
00014 #ifndef __STL_CONTAINER_CONCEPTS_H
00015 #define __STL_CONTAINER_CONCEPTS_H
00016 
00017 
00018 #include <bits/concept_checks.h>
00019 
00020 #ifdef __STL_USE_CONCEPT_CHECKS
00021 
00022 
00023 // This file covers the following concepts:
00024 //       _Container
00025 //       _ForwardContainer
00026 //       _ReversibleContainer
00027 //       _const_ReversibleContainer
00028 //       _RandomAccessContainer
00029 //
00030 
00031 struct _ERROR_IN_STL_CONTAINER {
00032 
00033   /* Container expresssions */
00034 
00035   template <class _Container>
00036   static void
00037   __begin_iterator_accessor_requirement_violation(_Container __c) {
00038     __c.begin();
00039   }
00040   template <class _Container>
00041   static void
00042   __const_begin_iterator_accessor_requirement_violation(const _Container& __c) {
00043     __c.begin();
00044   }
00045   template <class _Container>
00046   static void
00047   __end_iterator_accessor_requirement_violation(_Container __c) {
00048     __c.end();
00049   }
00050   template <class _Container>
00051   static void
00052   __const_end_iterator_accessor_requirement_violation(const _Container& __c) {
00053     __c.end();
00054   }
00055 
00056   template <class _Container>
00057   static void
00058   __rbegin_iterator_accessor_requirement_violation(_Container __c) {
00059     __c.rbegin();
00060   }
00061   template <class _Container>
00062   static void
00063   __const_rbegin_iterator_accessor_requirement_violation(const _Container& __c) {
00064     __c.rbegin();
00065   }
00066   template <class _Container>
00067   static void
00068   __rend_iterator_accessor_requirement_violation(_Container __c) {
00069     __c.rend();
00070   }
00071   template <class _Container>
00072   static void
00073   __const_rend_iterator_accessor_requirement_violation(const _Container& __c) {
00074     __c.rend();
00075   }
00076   template <class _Container>
00077   static void
00078   __size_function_must_be_const(const _Container& __c) {
00079     __c.size();
00080   }
00081   template <class _Container>
00082   static void
00083   __size_function_requirement_violation(_Container& __c) {
00084     __c.size();
00085     __size_function_must_be_const(__c);
00086   }
00087   template <class _Container>
00088   static void
00089   __max_size_function_must_be_const(const _Container& __c) {
00090     __c.max_size();
00091   }
00092   template <class _Container>
00093   static void
00094   __max_size_function_requirement_violation(_Container& __c) {
00095     __c.max_size();
00096     __max_size_function_must_be_const(__c);
00097   }
00098   template <class _Container>
00099   static void
00100   __empty_function_must_be_const(const _Container& __c) {
00101     __c.empty();
00102   }
00103   template <class _Container>
00104   static void
00105   __empty_function_requirement_violation(_Container& __c) {
00106     __c.empty();
00107     __empty_function_must_be_const(__c);
00108   }
00109   template <class _Container>
00110   static void
00111   __swap_function_requirement_violation(_Container& __c) {
00112     __c.swap(__c);
00113   }
00114 
00115 };
00116 
00117 
00118 __STL_TYPEDEF_REQUIREMENT(iterator);
00119 __STL_TYPEDEF_REQUIREMENT(const_iterator);
00120 
00121 /* Containers */
00122 
00123 template <class _Container>
00124 struct _Container_concept_specification {
00125 static void
00126 _Container_requirement_violation(_Container __c) {
00127   // Refinement of Assignable
00128   _Assignable_concept_specification<_Container>::_Assignable_requirement_violation(__c);
00129   // Associated Types
00130   __value_type__typedef_requirement_violation<_Container>();
00131   __difference_type__typedef_requirement_violation<_Container>();
00132   __size_type__typedef_requirement_violation<_Container>();
00133   __reference__typedef_requirement_violation<_Container>();
00134   __const_reference__typedef_requirement_violation<_Container>();
00135   __pointer__typedef_requirement_violation<_Container>();
00136   __const_pointer__typedef_requirement_violation<_Container>();
00137   __iterator__typedef_requirement_violation<_Container>();
00138   __const_iterator__typedef_requirement_violation<_Container>();
00139   // Valid Expressions
00140   _ERROR_IN_STL_CONTAINER::__const_begin_iterator_accessor_requirement_violation(__c);
00141   _ERROR_IN_STL_CONTAINER::__const_end_iterator_accessor_requirement_violation(__c);
00142   _ERROR_IN_STL_CONTAINER::__begin_iterator_accessor_requirement_violation(__c);
00143   _ERROR_IN_STL_CONTAINER::__end_iterator_accessor_requirement_violation(__c);
00144   _ERROR_IN_STL_CONTAINER::__size_function_requirement_violation(__c);
00145   _ERROR_IN_STL_CONTAINER::__max_size_function_requirement_violation(__c);
00146   _ERROR_IN_STL_CONTAINER::__empty_function_requirement_violation(__c);
00147   _ERROR_IN_STL_CONTAINER::__swap_function_requirement_violation(__c);
00148   // Requirements on Iterators
00149   typedef typename _Container::iterator iter;
00150   typedef typename _Container::const_iterator const_iter;
00151   _InputIterator_concept_specification<const_iter>::_InputIterator_requirement_violation(const_iter());
00152   _InputIterator_concept_specification<iter>::_InputIterator_requirement_violation(iter());
00153 }
00154 };
00155 
00156 template <class _ForwardContainer>
00157 struct _ForwardContainer_concept_specification {
00158 static void
00159 _ForwardContainer_requirement_violation(_ForwardContainer __c) {
00160   // Refinement of Container
00161   _Container_concept_specification<_ForwardContainer>::_Container_requirement_violation(__c);
00162   // Requirements on Iterators
00163   typedef typename _ForwardContainer::iterator iter;
00164   typedef typename _ForwardContainer::const_iterator const_iter;
00165   _ForwardIterator_concept_specification<const_iter>::_ForwardIterator_requirement_violation(const_iter());
00166   _Mutable_ForwardIterator_concept_specification<iter>::_Mutable_ForwardIterator_requirement_violation(iter());
00167 }
00168 };
00169 
00170 
00171 __STL_TYPEDEF_REQUIREMENT(reverse_iterator);
00172 __STL_TYPEDEF_REQUIREMENT(const_reverse_iterator);
00173 
00174 template <class _ReversibleContainer>
00175 struct _ReversibleContainer_concept_specification {
00176 static void
00177 _ReversibleContainer_requirement_violation(_ReversibleContainer __c) {
00178   // Refinement of ForwardContainer
00179   _ForwardContainer_concept_specification<_ReversibleContainer>::_ForwardContainer_requirement_violation(__c);
00180   // Associated types
00181   __reverse_iterator__typedef_requirement_violation<_ReversibleContainer>();
00182   __const_reverse_iterator__typedef_requirement_violation<_ReversibleContainer>();
00183   // Valid Expressions
00184   _ERROR_IN_STL_CONTAINER::__const_rbegin_iterator_accessor_requirement_violation(__c);
00185   _ERROR_IN_STL_CONTAINER::__const_rend_iterator_accessor_requirement_violation(__c);
00186   _ERROR_IN_STL_CONTAINER::__rbegin_iterator_accessor_requirement_violation(__c);
00187   _ERROR_IN_STL_CONTAINER::__rend_iterator_accessor_requirement_violation(__c);
00188   // Requirements on Iterators
00189   typedef typename _ReversibleContainer::iterator iter;
00190   typedef typename _ReversibleContainer::const_iterator const_iter;
00191   _BidirectionalIterator_concept_specification<const_iter>::_BidirectionalIterator_requirement_violation(const_iter());
00192   _Mutable_BidirectionalIterator_concept_specification<iter>::_Mutable_BidirectionalIterator_requirement_violation(iter());
00193 }
00194 };
00195 
00196 template <class _ReversibleContainer>
00197 struct _const_ReversibleContainer_concept_specification {
00198 static void
00199 _const_ReversibleContainer_requirement_violation(_ReversibleContainer __c) {
00200   // Refinement of Container (JGS, not ForwardContainer)
00201   _Container_concept_specification<_ReversibleContainer>::_Container_requirement_violation(__c);
00202   // Associated types
00203   __reverse_iterator__typedef_requirement_violation<_ReversibleContainer>();
00204   __const_reverse_iterator__typedef_requirement_violation<_ReversibleContainer>();
00205   // Valid Expressions
00206   _ERROR_IN_STL_CONTAINER::__const_rbegin_iterator_accessor_requirement_violation(__c);
00207   _ERROR_IN_STL_CONTAINER::__const_rend_iterator_accessor_requirement_violation(__c);
00208   _ERROR_IN_STL_CONTAINER::__rbegin_iterator_accessor_requirement_violation(__c);
00209   _ERROR_IN_STL_CONTAINER::__rend_iterator_accessor_requirement_violation(__c);
00210   // Requirements on Iterators
00211   typedef typename _ReversibleContainer::iterator iter;
00212   typedef typename _ReversibleContainer::const_iterator const_iter;
00213   
00214   _BidirectionalIterator_concept_specification<const_iter>::_BidirectionalIterator_requirement_violation(const_iter());
00215 }
00216 };
00217 
00218 
00219 template <class _RandomAccessContainer>
00220 struct _RandomAccessContainer_concept_specification {
00221 static void
00222 _RandomAccessContainer_requirement_violation(_RandomAccessContainer __c) {
00223   // Refinement of ReversibleContainer
00224   _ReversibleContainer_concept_specification<_RandomAccessContainer>::_ReversibleContainer_requirement_violation(__c);
00225   // Valid Expressions
00226   typedef typename _RandomAccessContainer::value_type __T;
00227   typedef typename _RandomAccessContainer::difference_type _Dist;
00228   typedef typename _Mutable_trait<__T>::_Type Type;
00229   typedef Type* _TypePtr;
00230   typedef typename _Mutable_trait<_Dist>::_Type Dist;
00231   _STL_ERROR::__element_access_operator_requirement_violation(__c,
00232                                   _TypePtr(), 
00233                                   Dist());
00234   // Requirements on Iterators
00235   typedef typename _RandomAccessContainer::iterator iter;
00236   typedef typename _RandomAccessContainer::const_iterator const_iter;
00237   _RandomAccessIterator_concept_specification<const_iter>::_RandomAccessIterator_requirement_violation(const_iter());
00238   _Mutable_RandomAccessIterator_concept_specification<iter>::_Mutable_RandomAccessIterator_requirement_violation(iter());
00239 }
00240 };
00241 
00242 #endif /* if __STL_USE_CONCEPT_CHECKS */
00243 
00244 #endif /* __STL_CONTAINER_CONCEPTS_H */

Generated on Mon Apr 8 03:11:24 2002 for libstdc++-v3 Source by doxygen1.2.15