00001
00008
00009
00010
00011
00012 #ifndef ECL_CONTAINERS_INITIALISER_HPP_
00013 #define ECL_CONTAINERS_INITIALISER_HPP_
00014
00015
00016
00017
00018
00019 #include <cstddef>
00020 #include "definitions.hpp"
00021 #include <ecl/config/macros.hpp>
00022 #include <ecl/exceptions/standard_exception.hpp>
00023
00024
00025
00026
00027
00028 namespace ecl {
00029 namespace containers {
00030
00031
00032
00033
00048 template<class Type, class Iterator, std::size_t N = ecl::DynamicStorage>
00049 class ECL_LOCAL BoundedListInitialiser {
00050
00051 public:
00058 BoundedListInitialiser(const Type &value, Iterator iter);
00059
00060 virtual ~BoundedListInitialiser() {}
00061
00072 BoundedListInitialiser<Type, Iterator, N>& operator,(const Type &value) ecl_assert_throw_decl(StandardException);
00073
00074 protected:
00075 Iterator iterator;
00076 std::size_t current_size;
00077 };
00078
00079
00080
00081
00082
00083 template <typename Type, typename Iterator, std::size_t N>
00084 BoundedListInitialiser<Type,Iterator,N>::BoundedListInitialiser(const Type &value, Iterator iter) :
00085 iterator(iter),
00086 current_size(1)
00087 {
00088 *iterator = value;
00089 ++iterator;
00090 }
00091 template <typename Type,typename Iterator,std::size_t N>
00092 BoundedListInitialiser<Type,Iterator,N>& BoundedListInitialiser<Type,Iterator,N>::operator,(const Type &value) ecl_assert_throw_decl(StandardException)
00093 {
00094 ecl_assert_throw( current_size < N, StandardException(LOC,OutOfRangeError) );
00095 *iterator = value;
00096 iterator++;
00097 current_size++;
00098 return *this;
00099 }
00100
00101
00102
00103
00116 template<class Type, class Iterator>
00117 class ECL_LOCAL BoundedListInitialiser<Type,Iterator,DynamicStorage> {
00118
00119 public:
00129 BoundedListInitialiser(const Type &value, Iterator iter, std::size_t bound) ecl_assert_throw_decl(StandardException);
00130
00131 virtual ~BoundedListInitialiser() {}
00142 BoundedListInitialiser<Type, Iterator, DynamicStorage>& operator,(const Type &value) ecl_assert_throw_decl(StandardException);
00143
00144 protected:
00145 Iterator iterator;
00146 std::size_t current_size;
00147 const std::size_t upper_bound;
00148 };
00149
00150
00151
00152
00153
00154 template <typename Type, typename Iterator>
00155 BoundedListInitialiser<Type,Iterator,DynamicStorage>::BoundedListInitialiser(const Type &value, Iterator iter, std::size_t bound) ecl_assert_throw_decl(StandardException) :
00156 iterator(iter),
00157 current_size(1),
00158 upper_bound(bound)
00159 {
00160 ecl_assert_throw( current_size <= upper_bound, StandardException(LOC,OutOfRangeError) );
00161 *iterator = value;
00162 ++iterator;
00163 }
00164 template <typename Type,typename Iterator>
00165 BoundedListInitialiser<Type,Iterator,DynamicStorage>& BoundedListInitialiser<Type,Iterator,DynamicStorage>::operator,(const Type &value) ecl_assert_throw_decl(StandardException)
00166 {
00167 ecl_assert_throw( current_size < upper_bound, StandardException(LOC,OutOfRangeError) );
00168 *iterator = value;
00169 iterator++;
00170 current_size++;
00171 return *this;
00172 }
00173
00174 };
00175 };
00176
00177 #endif