20 #ifndef BK_LIB_POD_VECTOR_H_INCLUDED
21 #define BK_LIB_POD_VECTOR_H_INCLUDED
29 namespace bk_lib {
namespace detail {
31 void fill(T* first, T* last,
const T&
x) {
32 assert(first <= last);
33 switch ((last - first) & 7u)
39 case 7:
new(first++) T(x);
40 case 6:
new(first++) T(x);
41 case 5:
new(first++) T(x);
42 case 4:
new(first++) T(x);
43 case 3:
new(first++) T(x);
44 case 2:
new(first++) T(x);
45 case 1:
new(first++) T(x);
46 assert(first <= last);
50 template <
class Iter,
class T>
51 void copy(Iter first, Iter last, std::size_t
s, T*
out) {
57 new(out++) T(*first++);
58 case 7:
new(out++) T(*first++);
59 case 6:
new(out++) T(*first++);
60 case 5:
new(out++) T(*first++);
61 case 4:
new(out++) T(*first++);
62 case 3:
new(out++) T(*first++);
63 case 2:
new(out++) T(*first++);
64 case 1:
new(out++) T(*first++);
73 private:
Fill& operator=(
const Fill&);
87 std::memcpy(out,
first_, n*
sizeof(T));
114 template <
class T,
class Allocator = std::allocator<T> >
130 sizeof(
typename Allocator::size_type)<=
sizeof(
unsigned int),
131 typename Allocator::size_type,
132 unsigned int>
::type size_type;
134 sizeof(
typename Allocator::difference_type)<=
sizeof(
int),
135 typename Allocator::difference_type,
136 int>
::type difference_type;
164 template <
class Iter>
167 insert_range(
end(), first, last,
typename std::iterator_traits<Iter>::iterator_category());
174 pod_vector(
const pod_vector& other) : ebo_(other.size(), other.get_allocator()) {
175 std::memcpy(ebo_.buf, other.begin(), other.size()*
sizeof(T));
176 ebo_.size = other.size();
179 pod_vector& operator=(
const pod_vector& other) {
180 if (
this != &other) {
181 assign(other.begin(), other.end());
198 size_type size()
const {
return ebo_.size; }
200 size_type max_size()
const {
201 typename allocator_type::size_type
x = get_allocator().max_size();
202 std::size_t y = size_type(-1)/
sizeof(T);
203 return static_cast<size_type
>(std::min(std::size_t(x), y));
206 size_type capacity()
const {
return ebo_.cap; }
208 bool empty()
const {
return ebo_.size == 0; }
249 if (n < size())
return ebo_.buf[n];
250 throw std::range_error(
"pod_vector::at");
254 if (n < size())
return ebo_.buf[n];
255 throw std::range_error(
"pod_vector::at");
259 reference front() { assert(!empty());
return *ebo_.buf; }
264 reference back() { assert(!empty());
return ebo_.buf[ebo_.size-1]; }
267 const_reference back()
const { assert(!empty());
return ebo_.buf[ebo_.size-1]; }
279 void clear() { ebo_.size = 0; }
283 insert(
end(), n, val);
286 template <
class Iter>
287 void assign(Iter first, Iter last) {
289 insert(
end(), first, last);
301 assert(!empty() && pos !=
end());
311 if (
end() - last > 0) {
312 std::memmove(first, last, (
end() - last) *
sizeof(T));
314 ebo_.size -=
static_cast<size_type
>(last - first);
326 void resize(size_type ns,
const T& val = T()) {
328 ns <= capacity() ?
detail::fill(
end(),
end()+(ns-size()), val) : append_realloc(ns-size(), val);
342 void reserve(size_type n) {
343 if (n > capacity()) {
344 T* temp = ebo_.allocate(n);
345 std::memcpy(temp, ebo_.buf, size()*
sizeof(T));
352 void swap(pod_vector& other) {
359 void push_back(
const T& x) {
360 if (size() < capacity()) {
361 new ((ebo_.buf+ebo_.size++)) T(x);
364 append_realloc(1, x);
386 return insert(pos, (size_type)1, val);
394 size_type off =
static_cast<size_type
>(pos-
begin());
395 insert_impl(pos, n, detail::Fill<T>(val));
396 return ebo_.buf + off;
407 template <
class Iter>
409 insert_range(pos, first, last,
typename std::iterator_traits<Iter>::iterator_category());
427 void resize_no_init(size_type ns) {
433 size_type grow_size(size_type n) {
434 size_type new_cap = size() + n;
435 assert(new_cap > size() &&
"pod_vector: max size exceeded!");
436 assert(new_cap > capacity());
437 if (new_cap < 4) new_cap = 1 << (new_cap+1);
438 size_type x = (capacity()*3)>>1;
439 if (new_cap < x) new_cap =
x;
442 void append_realloc(size_type n,
const T& x) {
443 size_type new_cap = grow_size(n);
444 pointer temp = ebo_.allocate(new_cap);
445 std::memcpy(temp, ebo_.buf, size()*
sizeof(T));
452 void move_right(
iterator pos, size_type n) {
453 assert( (pos || n == 0) && (ebo_.eos() - pos) >= (
int)n);
454 std::memmove(pos + n, pos, (
end() - pos) * sizeof(T));
457 void insert_range(
iterator pos, It first, It last, std::random_access_iterator_tag,
458 typename detail::disable_if<detail::same_type<
pointer, It>::value == 0 && detail::same_type<
const_pointer, It>::value == 0>::
type* = 0) {
459 assert( (first <
begin() || first >=
end()) &&
"pod_vec::insert(): Precondition violated!");
460 typename allocator_type::difference_type diff = std::distance(first, last);
461 assert(diff == 0 || (static_cast<size_type>(size()+diff) > size() &&
"pod_vector: max size exceeded!"));
462 insert_impl(pos, static_cast<size_type>(diff), detail::Memcpy<T>(first));
465 void insert_range(
iterator pos, It first, It last, std::forward_iterator_tag) {
466 typename allocator_type::difference_type diff = std::distance(first, last);
467 assert(diff == 0 || (static_cast<size_type>(size()+diff) > size() &&
"pod_vector: max size exceeded!"));
468 insert_impl(pos, static_cast<size_type>(diff), detail::Copy<It>(first, last));
470 template <
class Iter>
471 void insert_range(
iterator pos, Iter first, Iter last, std::input_iterator_tag) {
473 while (first != last) temp.push_back(*first++);
474 insert(pos, temp.begin(), temp.end());
480 template <
class ST,
class P>
482 assert(n == 0 || (size()+n) > size() );
483 if (size()+n <= capacity()) {
489 size_type new_cap = grow_size(n);
490 pointer temp = ebo_.allocate(new_cap);
491 size_type prefix =
static_cast<size_type
>(pos-
begin());
493 std::memcpy(temp,
begin(), prefix*
sizeof(T));
495 pred(temp+prefix, n);
497 std::memcpy(temp+prefix+n, pos, (
end()-pos)*
sizeof(T));
504 struct ebo :
public Allocator {
505 typedef typename this_type::size_type size_type;
510 ebo(size_type n,
const Allocator&
a) : Allocator(a), buf(0), size(0), cap(n) {
511 if (n > 0) { buf = A::allocate(n); }
513 ~ebo() { release(); }
514 void release() {
if (buf) A::deallocate(buf, cap); }
515 T* eos()
const {
return buf + cap; }
519 template <
class T,
class A>
521 return lhs.size() == rhs.size()
522 && std::equal(lhs.begin(), lhs.end(), rhs.begin());
525 template <
class T,
class A>
527 return ! (lhs ==
rhs);
530 template <
class T,
class A>
532 return std::lexicographical_compare(
lhs.begin(),
lhs.end(),
rhs.begin(),
rhs.end());
535 template <
class T,
class A>
540 template <
class T,
class A>
545 template <
class T,
class A>
550 template <
class T,
class A>
BinderType type
Definition: statements.cc:1283
Definition: pod_vector.h:102
const T & val_
Definition: pod_vector.h:72
void operator()(T *out, std::size_t n) const
Definition: pod_vector.h:79
const T * first_
Definition: pod_vector.h:89
Definition: pod_vector.h:100
bool operator!=(const pod_vector< T, A > &lhs, const pod_vector< T, A > &rhs)
Definition: pod_vector.h:526
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition: pod_vector.h:127
void operator()(T *out, std::size_t n) const
Definition: pod_vector.h:86
tuple s
Definition: server.py:45
UTerm lhs
Definition: literals.cc:185
bool operator>(const pod_vector< T, A > &lhs, const pod_vector< T, A > &rhs)
Definition: pod_vector.h:536
Allocator::const_pointer const_pointer
Definition: pod_vector.h:125
Allocator allocator_type
Definition: pod_vector.h:119
tuple a
Definition: pyclingo.py:6
bool operator==(const pod_vector< T, A > &lhs, const pod_vector< T, A > &rhs)
Definition: pod_vector.h:520
Memcpy(const T *first)
Definition: pod_vector.h:85
Iter last_
Definition: pod_vector.h:81
std::unique_ptr< ValTerm > val(Value v)
Definition: term_helper.hh:31
Definition: pod_vector.h:94
Term & rhs
Definition: literals.cc:186
Definition: pod_vector.h:69
Definition: pod_vector.h:84
char(& no_type)[2]
Definition: pod_vector.h:92
void operator()(T *first, std::size_t n) const
Definition: pod_vector.h:71
Definition: pod_vector.h:76
char yes_type
Definition: pod_vector.h:91
static yes_type isPtr(const volatile void *)
void copy(Iter first, Iter last, std::size_t s, T *out)
Definition: pod_vector.h:51
static yes_type isLong(int64)
unsigned num
Definition: dependency.cc:114
UTerm assign
Definition: literals.cc:59
bool operator>=(const pod_vector< T, A > &lhs, const pod_vector< T, A > &rhs)
Definition: pod_vector.h:546
Copy(Iter first, Iter last)
Definition: pod_vector.h:77
Allocator::reference reference
Definition: pod_vector.h:120
Definition: type_manip.h:36
Allocator::const_reference const_reference
Definition: pod_vector.h:121
int x
Definition: utility.cc:65
void fill(T *first, T *last, const T &x)
Definition: pod_vector.h:31
Gringo::IntervalSet< T >::const_iterator begin(Gringo::IntervalSet< T > const &x)
Definition: intervals.hh:311
Allocator::const_pointer const_iterator
Definition: pod_vector.h:123
Allocator::pointer iterator
Definition: pod_vector.h:122
Definition: pod_vector.h:101
Allocator::pointer pointer
Definition: pod_vector.h:124
pod_vector< T, Allocator > this_type
Definition: pod_vector.h:118
A std::vector-replacement for POD-Types.
Definition: pod_vector.h:115
Fill(const T &val)
Definition: pod_vector.h:70
T value_type
Definition: pod_vector.h:128
void swap(pod_vector< T, A > &lhs, pod_vector< T, A > &rhs)
Definition: pod_vector.h:551
LparseOutputter & out
Definition: output.cc:685
Iter first_
Definition: pod_vector.h:80
int end
Definition: literals.cc:62
std::reverse_iterator< iterator > reverse_iterator
Definition: pod_vector.h:126