Go to the documentation of this file.00001
00008
00009
00010
00011
00012 #ifndef ECL_CONCEPTS_CONCEPTS_CONTAINERS_HPP_
00013 #define ECL_CONCEPTS_CONCEPTS_CONTAINERS_HPP_
00014
00015
00016
00017
00018
00019 #include <ecl/config/ecl.hpp>
00020 #include <ecl/type_traits/fundamental_types.hpp>
00021 #include "macros.hpp"
00022
00023
00024
00025
00026
00027 namespace ecl {
00028
00029
00030
00031
00032
00036 template <typename Implementation>
00037 class ContainerConcept {
00038 public:
00039
00050 ecl_compile_time_concept_test(ContainerConcept)
00051 {
00052 typedef typename Implementation::value_type element_type;
00053 typedef typename Implementation::iterator iterator;
00054 iter = container.begin();
00055 iter = container.end();
00056 unsigned int n;
00057 n = container.size();
00058 (void) n;
00059 }
00060
00061 private:
00062
00063
00064 Implementation container;
00065 typename Implementation::iterator iter;
00066 };
00070 template <typename Implementation>
00071 class DynamicContainerConcept {
00072 public:
00073
00085 ecl_compile_time_concept_test(DynamicContainerConcept)
00086 {
00087 typedef typename Implementation::value_type element_type;
00088 typedef typename Implementation::iterator iterator;
00089 iter = container.begin();
00090 iter = container.end();
00091 unsigned int n;
00092 n = container.size();
00093 container.resize(1);
00094 (void) n;
00095 }
00096
00097 private:
00098
00099
00100 Implementation container;
00101 typename Implementation::iterator iter;
00102 };
00103
00107 namespace concepts {
00108
00118 template <typename T, bool Result=false>
00119 class SignedByteTest {
00120 private:
00121 SignedByteTest() {}
00122 };
00123
00133 template <typename T>
00134 class SignedByteTest<T,true> {
00135 public:
00136 SignedByteTest() {}
00137 };
00138
00148 template <typename T, bool Result=false>
00149 class UnsignedByteTest {
00150 private:
00151 UnsignedByteTest() {}
00152 };
00153
00163 template <typename T>
00164 class UnsignedByteTest<T,true> {
00165 public:
00166 UnsignedByteTest() {}
00167 };
00168
00175 template <typename T>
00176 class SignedByteTestCheck : public SignedByteTest<T, ecl::is_signed_byte<T>::value > {};
00177
00184 template <typename T>
00185 class UnsignedByteTestCheck : public UnsignedByteTest<T, ecl::is_unsigned_byte<T>::value > {};
00186
00195 template <typename T>
00196 class ByteTest {
00197 private:
00198 ByteTest() {}
00199 };
00200
00209 template <>
00210 class ByteTest<unsigned char> {
00211 public:
00212 ByteTest() {}
00213 };
00217 template <>
00218 class ByteTest<char> {
00219 public:
00220 ByteTest() {}
00221 };
00222
00226 template <>
00227 class ByteTest<signed char> {
00228 public:
00229 ByteTest() {}
00230 };
00231
00232 }
00240 template <typename Implementation>
00241 class UnsignedByteContainerConcept {
00242 public:
00243
00253 ecl_compile_time_concept_test(UnsignedByteContainerConcept)
00254 {
00255 typedef typename Implementation::value_type element_type;
00256 typedef typename Implementation::iterator iterator;
00257 iter = container.begin();
00258 iter = container.end();
00259 unsigned int n;
00260 n = container.size();
00261
00262 concepts::UnsignedByteTestCheck<element_type> char_test;
00263 (void) n;
00264 }
00265
00266 private:
00267
00268
00269 Implementation container;
00270 typename Implementation::iterator iter;
00271 };
00272
00276 template <typename Implementation>
00277 class SignedByteContainerConcept {
00278 public:
00279
00289 ecl_compile_time_concept_test(SignedByteContainerConcept)
00290 {
00291 typedef typename Implementation::value_type element_type;
00292 typedef typename Implementation::iterator iterator;
00293 iter = container.begin();
00294 iter = container.end();
00295 unsigned int n;
00296 n = container.size();
00297
00298 concepts::SignedByteTestCheck<element_type> char_test;
00299 }
00300
00301 private:
00302
00303
00304 Implementation container;
00305 typename Implementation::iterator iter;
00306 };
00307
00313 template <typename Implementation>
00314 class ByteContainerConcept {
00315 public:
00316
00326 ecl_compile_time_concept_test(ByteContainerConcept)
00327 {
00328 typedef typename Implementation::value_type element_type;
00329 typedef typename Implementation::iterator iterator;
00330 iter = container.begin();
00331 iter = container.end();
00332 unsigned int n;
00333 n = container.size();
00334
00335 concepts::ByteTest<element_type> char_test;
00336 (void) n;
00337 }
00338
00339 private:
00340
00341
00342 Implementation container;
00343 typename Implementation::iterator iter;
00344 };
00345
00346 };
00347
00348 #endif