1 #ifndef PROTON_DEQUE_HEADER
2 #define PROTON_DEQUE_HEADER
13 #include <initializer_list>
18 #include <proton/pool.hpp>
32 template <
typename T,
typename A,
typename V>
33 std::deque<T,A>& operator<<(std::deque<T,A>& x, V&& val)
44 template <
typename T,
typename A,
typename V>
58 template <
typename T,
typename A>
59 std::ostream& operator<<(std::ostream& s, const std::deque<T,A>& x)
74 template <
typename T,
typename A>
75 std::wostream& operator<<(std::wostream& s, const std::deque<T,A>& x)
93 template <
typename T,
typename A>
94 void sort(std::deque<T,A>& x)
96 std::sort(x.begin(), x.end());
104 template <
typename T,
typename A>
105 T&
get(std::deque<T,A>& x,
long i)
107 unsigned long s=x.size();
110 if(i<0 || (
unsigned long)i >= s )
111 PROTON_ERR(
"out of range: look up "<<i<<
" in deque whose size is " << s);
120 template <
typename T,
typename A>
121 const T&
get(
const std::deque<T,A>& x,
long i)
123 unsigned long s=x.size();
126 if(i<0 || (
unsigned long)i >= s )
127 PROTON_ERR(
"out of range: look up "<<i<<
" in deque whose size is " << s);
136 template <
typename T,
typename A>
137 std::deque<T,A> sub(
const std::deque<T,A>& x,
long first)
140 unsigned long s=x.size();
145 if((
unsigned long)first >= s )
148 auto start=x.begin();
149 std::copy(start+first, x.end(), std::back_inserter(r));
159 template <
typename T,
typename A>
160 std::deque<T,A> sub(
const std::deque<T,A>& x,
long first,
long last)
163 unsigned long s=x.size();
168 if((
unsigned long)first >= s )
176 if((
unsigned long)last>s)
178 auto start=x.begin();
179 std::copy(start+first, start+last, std::back_inserter(r));
185 template <
typename T,
typename A=smart_allocator<T> >
188 typedef std::deque<T,A> baseT;
189 typedef typename baseT::difference_type offset_t;
192 offset_t __offset(offset_t i)
const
199 offset_t offset(offset_t i)
const
202 PROTON_THROW_IF(i<0 || (
size_t)i>=this->size(),
"out of range, offset is " << i
203 <<
" while size is " << this->size() );
207 int fix_offset(offset_t begin)
const
209 offset_t size=(offset_t)this->size();
210 begin=__offset(begin);
219 void fix_range(offset_t& begin, offset_t& end)
const
221 offset_t size=(offset_t)this->size();
222 begin=__offset(begin);
224 if(begin>=size || end<=0 || end<=begin){
238 template<
typename ...argT>
deque_(argT&& ...a):baseT(a...)
243 deque_(std::initializer_list<T> a):baseT(a)
256 explicit deque_(
const baseT& x):baseT(x)
259 deque_(baseT&& x)noexcept:baseT(x)
304 return reinterpret_cast<baseT&
>(*this);
311 return *(this->begin()+offset(i));
318 return *(this->begin()+offset(i));
325 auto begin=this->begin();
326 return deque_(begin+offset(i),this->end());
333 auto begin=this->begin();
335 return deque_(begin+i,begin+j);
344 auto it=this->begin()+i;
345 for(offset_t n=i; n<j; n+=k,it+=k)
366 return std::count(this->begin(), this->end(), x);
373 this->erase(this->begin()+offset(i));
378 void del(offset_t i, offset_t j)
381 auto begin=this->begin();
382 this->erase(begin+i, begin+j);
389 this->erase(this->begin()+offset(i), this->end());
394 template<
typename seqT>
void extend(
const seqT& x)
401 template<
typename seqT>
void extend(seqT&& x)
414 auto begin=this->begin(), end=this->end();
415 auto it=std::find(begin, end, val);
417 throw std::invalid_argument(
"The given value doesn't exist in this sequence.");
428 auto it=this->begin()+ offset(i);
432 void insert(offset_t i, T&& val)
434 auto it=this->begin()+offset(i);
445 auto it=this->begin()+offset(i);
455 void remove(
const T& val)
457 auto begin=this->begin(), end=this->end();
458 auto it=std::find(begin, end, val);
460 throw std::invalid_argument(
"The given value doesn't exist in this sequence.");
480 template<
class cmpT>
void sort(cmpT cmp)
482 std::sort(this->begin(), this->end(),cmp);
493 template<
typename T,
typename A,
typename X>
497 r.
extend(std::forward<X>(t));
501 template<
typename T,
typename A,
typename X>
502 deque_<T,A>
operator+(std::deque<T,A>&& s, X&& t)
505 r.extend(std::forward<X>(t));
511 template<
typename T,
typename A>
515 for(
size_t i=0; i<n; i++)
522 template<
typename T,
typename A>
530 template<
typename T,
typename A>
536 template<
typename T,
typename A>
537 const deque_<T,A>&
cast_(
const std::deque<T,A>& x)
539 return reinterpret_cast<const deque_<T,A>&
>(x);
542 template<
typename T,
typename A>
543 deque_<T,A>&&
cast_(std::deque<T,A>&& x)
545 return reinterpret_cast<deque_<T,A>&&
>(x);
548 template<
typename T,
typename A>
549 const deque_<T,A>&&
cast_(
const std::deque<T,A>&& x)
551 return reinterpret_cast<const deque_<T,A>&&
>(x);
559 #endif // PROTON_DEQUE_HEADER