Go to the documentation of this file.00001
00011
00012
00013
00014
00015 #ifndef ECL_CONTAINERS_PUSH_AND_POP_FIXED_HPP_
00016 #define ECL_CONTAINERS_PUSH_AND_POP_FIXED_HPP_
00017
00018
00019
00020
00021
00022 #include <iostream>
00023 #include <algorithm>
00024 #include <ecl/config/macros.hpp>
00025 #include <ecl/errors/compile_time_assert.hpp>
00026 #include <ecl/exceptions/standard_exception.hpp>
00027 #include "../array.hpp"
00028
00029
00030
00031
00032
00033 namespace ecl
00034 {
00035
00036
00037
00038
00039
00040
00041 namespace formatters {
00042
00043 template <typename Type, size_t N> class PushAndPopFormatter;
00044
00045 }
00046
00047
00048
00049
00075 template<typename Type, std::size_t Size=DynamicStorage>
00076 class ECL_PUBLIC PushAndPop
00077 {
00078 public:
00079 typedef formatters::PushAndPopFormatter<Type,Size> Formatter;
00081 PushAndPop()
00082 :
00083 size_fifo(Size+1),
00084 leader(0),
00085 follower(0)
00086 {
00087 }
00088
00089 PushAndPop( const Type & d ) ecl_assert_throw_decl(StandardException)
00090 :
00091 size_fifo(Size+1),
00092 leader(0),
00093 follower(0)
00094 {
00095 ecl_assert_throw( (size_fifo>0), StandardException(LOC, OutOfRangeError, "SimpleFIFO start with zero size buffer"));
00096 fill( d );
00097 }
00098 virtual ~PushAndPop()
00099 {}
00100
00101 Type & operator[] (int idx)
00102 {
00103 return data[ ((follower+idx)%size_fifo) ];
00104 }
00105
00106 const Type & operator[] (int idx) const
00107 {
00108 return data[ ((follower+idx)%size_fifo) ];
00109 }
00110
00111 void operator() (const PushAndPop<Type,Size> & otherOne )
00112 {
00113 leader = otherOne.leader;
00114 follower = otherOne.follower;
00115 for( int i=0; i<size_fifo; i++ )
00116 {
00117 data[i] = otherOne.data[i];
00118 }
00119 }
00120
00127 void push_back( const Type & datum )
00128 {
00129 data[ leader++ ] = datum;
00130 leader %= size_fifo;
00131 if( leader == follower )
00132 {
00133 follower++;
00134 follower %= size_fifo;
00135
00136 }
00137 }
00138
00139 Type pop_front()
00140 {
00141 ecl_assert_throw( (follower != leader), StandardException(LOC, OutOfRangeError, "PushAndPop follower==leader"));
00142 Type value = data[follower++];
00143 follower %= size_fifo;
00144 return value;
00145 }
00146
00147 void fill( const Type & d )
00148 {
00149 for( unsigned int i=0; i<size_fifo; i++ ) data[i] = d;
00150 }
00151
00157 unsigned int asize()
00158 {
00159 return size_fifo;
00160 }
00161
00162 unsigned int size() const
00163 {
00164 if( leader > follower ) return leader - follower;
00165 else if( leader < follower ) return size_fifo-follower+leader;
00166 return 0;
00167 }
00168
00169 void clear()
00170 {
00171 follower = 0;
00172 leader = 0;
00173 }
00174
00175 void showMe()
00176 {
00177 std::cout << "[Size|Leader|Follower]: " << size_fifo << "|" << leader << "|" << follower << std::endl;
00178 }
00179
00180 private:
00181 ecl::Array <Type,Size+1>data;
00182 unsigned int size_fifo;
00183 int leader;
00184 int follower;
00185 };
00186
00187 }
00188
00189 #endif