Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <stdexcept>
- template<class T>
- class ringBuffer{
- public:
- ringBuffer(const size_t& size) // аргумент size является обязательным
- :_size(size)
- ,_begin(0)
- ,_end(0)
- ,_isEmpty(true)
- ,_array(new T[size])
- {
- if(size<1){
- throw std::invalid_argument("size should be more 0");
- }
- }
- ~ringBuffer(){
- delete [] _array;
- }
- void push(const T& val){ // добавление элемента
- if(_begin==_end && !_isEmpty){
- throw std::invalid_argument("ringBuffer is full");
- }
- _isEmpty=false;
- _array[_end]=val;
- _end=(_end+1)%_size;
- }
- void pop(){ // удаление элемента
- if(_isEmpty){
- throw std::invalid_argument("ringBuffer is empty");
- }
- _begin=(_begin+1)%_size;
- if(_begin==_end){
- _isEmpty=true;
- }
- }
- T getFirst()const{ // возвращает первый элемент
- if(_isEmpty){
- throw std::invalid_argument("ringBuffer is empty");
- }
- return _array[_begin];
- }
- T getLast()const{ // возвращает последний элемент
- if(_isEmpty){
- throw std::invalid_argument("ringBuffer is empty");
- }
- return _array[(_end==0)?(_size-1):(_end-1)];
- }
- bool isEmpty()const{ // пуст ли буффер
- return _isEmpty;
- }
- bool isFull()const{ // заполнен ли буффер
- return _begin==_end && !_isEmpty;
- }
- private:
- size_t _size; // размер массива
- size_t _begin; // первый элемент
- size_t _end; // элемент, следующий за последним элементов
- bool _isEmpty; // пуст ли массив
- T*_array; // массив
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement