inline fixed_size_queue<T, N>::~fixed_size_queue() { BOOST_SPIRIT_ASSERT(m_size <= N+1); BOOST_SPIRIT_ASSERT_FSQ_SIZE; BOOST_SPIRIT_ASSERT(m_head <= N+1); BOOST_SPIRIT_ASSERT(m_tail <= N+1); }
inline void fixed_size_queue<T, N>::serve(T& e) { BOOST_SPIRIT_ASSERT(m_size <= N+1); BOOST_SPIRIT_ASSERT_FSQ_SIZE; BOOST_SPIRIT_ASSERT(m_head <= N+1); BOOST_SPIRIT_ASSERT(m_tail <= N+1); e = m_queue[m_head]; pop_front(); }
inline fixed_size_queue<T, N>::fixed_size_queue(const fixed_size_queue& x) : m_head(x.m_head) , m_tail(x.m_tail) , m_size(x.m_size) { copy(x.begin(), x.end(), begin()); BOOST_SPIRIT_ASSERT(m_size <= N+1); BOOST_SPIRIT_ASSERT_FSQ_SIZE; BOOST_SPIRIT_ASSERT(m_head <= N+1); BOOST_SPIRIT_ASSERT(m_tail <= N+1); }
typename base_t::difference_type distance_to( iterator_adaptor<OtherDerivedT, OtherIteratorT, V, C, R, D> const &x) const { typedef typename base_t::difference_type diff_t; position const &p2 = static_cast<OtherDerivedT const &>(x).get_position(); std::size_t pos1 = p.pos; std::size_t pos2 = p2.pos; // Undefined behaviour if the iterators come from different // containers BOOST_SPIRIT_ASSERT(p.self == p2.self); if (pos1 < p.self->m_head) pos1 += QueueT::MAX_SIZE; if (pos2 < p2.self->m_head) pos2 += QueueT::MAX_SIZE; if (pos2 > pos1) return diff_t(pos2 - pos1); else return -diff_t(pos1 - pos2); }
inline fixed_size_queue<T, N>& fixed_size_queue<T, N>::operator=(const fixed_size_queue& x) { if (this != &x) { m_head = x.m_head; m_tail = x.m_tail; m_size = x.m_size; copy(x.begin(), x.end(), begin()); } BOOST_SPIRIT_ASSERT(m_size <= N+1); BOOST_SPIRIT_ASSERT_FSQ_SIZE; BOOST_SPIRIT_ASSERT(m_head <= N+1); BOOST_SPIRIT_ASSERT(m_tail <= N+1); return *this; }
inline void fixed_size_queue<T, N>::pop_front() { BOOST_SPIRIT_ASSERT(m_size <= N+1); BOOST_SPIRIT_ASSERT_FSQ_SIZE; BOOST_SPIRIT_ASSERT(m_head <= N+1); BOOST_SPIRIT_ASSERT(m_tail <= N+1); ++m_head; if (m_head == N+1) m_head = 0; --m_size; BOOST_SPIRIT_ASSERT(m_size <= N+1); BOOST_SPIRIT_ASSERT_FSQ_SIZE; BOOST_SPIRIT_ASSERT(m_head <= N+1); BOOST_SPIRIT_ASSERT(m_tail <= N+1); }
inline void fixed_size_queue<T, N>::push_back(const T& e) { BOOST_SPIRIT_ASSERT(m_size <= N+1); BOOST_SPIRIT_ASSERT_FSQ_SIZE; BOOST_SPIRIT_ASSERT(m_head <= N+1); BOOST_SPIRIT_ASSERT(m_tail <= N+1); BOOST_SPIRIT_ASSERT(!full()); m_queue[m_tail] = e; ++m_size; ++m_tail; if (m_tail == N+1) m_tail = 0; BOOST_SPIRIT_ASSERT(m_size <= N+1); BOOST_SPIRIT_ASSERT_FSQ_SIZE; BOOST_SPIRIT_ASSERT(m_head <= N+1); BOOST_SPIRIT_ASSERT(m_tail <= N+1); }
inline void fixed_size_queue<T, N>::push_front(const T& e) { BOOST_SPIRIT_ASSERT(m_size <= N+1); BOOST_SPIRIT_ASSERT_FSQ_SIZE; BOOST_SPIRIT_ASSERT(m_head <= N+1); BOOST_SPIRIT_ASSERT(m_tail <= N+1); BOOST_SPIRIT_ASSERT(!full()); if (m_head == 0) m_head = N; else --m_head; m_queue[m_head] = e; ++m_size; BOOST_SPIRIT_ASSERT(m_size <= N+1); BOOST_SPIRIT_ASSERT_FSQ_SIZE; BOOST_SPIRIT_ASSERT(m_head <= N+1); BOOST_SPIRIT_ASSERT(m_tail <= N+1); }
void concat(MatchT const& other) { BOOST_SPIRIT_ASSERT(*this && other); len += other.length(); }
bool test(T ch) const { BOOST_SPIRIT_ASSERT(first() <= last()); return (ch >= first()) && (ch <= last()); }