raiigraph
C++ RAII for igraph data structures
Loading...
Searching...
No Matches
Vector.hpp
Go to the documentation of this file.
1#ifndef RAIIGRAPH_VECTOR_HPP
2#define RAIIGRAPH_VECTOR_HPP
3
4#include "igraph.h"
5#include "error.hpp"
6
7#include <algorithm>
8#include <initializer_list>
9#include <iterator>
10
16namespace raiigraph {
17
28template<class Ns_>
29class Vector {
30private:
31 void setup(igraph_int_t size) {
32 check_code(Ns_::init(&my_vector, size));
33 }
34
35public:
39 typedef typename Ns_::igraph_type igraph_type;
40
44 typedef typename Ns_::value_type value_type;
45
50
55
59 typedef igraph_int_t size_type;
60
64 typedef igraph_int_t difference_type;
65
70
74 typedef const value_type* const_iterator;
75
79 typedef std::reverse_iterator<iterator> reverse_iterator;
80
84 typedef std::reverse_iterator<const_iterator> reverse_const_iterator;
85
86public:
90 Vector() : Vector(0) {}
91
97 setup(size);
98 std::fill_n(begin(), size, val);
99 }
100
104 Vector(igraph_type&& vector) : my_vector(std::move(vector)) {}
105
111 template<typename InputIterator, typename = decltype(*std::declval<InputIterator>())> // use SFINAE to avoid ambiguity with other 2-argument constructors.
112 Vector(InputIterator first, InputIterator last) : Vector(last - first) {
113 std::copy(first, last, begin());
114 }
115
116public:
121 Vector(const Vector<Ns_>& other) {
122 check_code(Ns_::copy(&my_vector, &(other.my_vector)));
123 }
124
130 if (this != &other) {
131 // my_vector should already be initialized before the assignment.
132 check_code(Ns_::update(&my_vector, &(other.my_vector)));
133 }
134 return *this;
135 }
136
142 setup(0); // we must leave 'other' in a valid state.
143 std::swap(my_vector, other.my_vector);
144 }
145
151 if (this != &other) {
152 std::swap(my_vector, other.my_vector); // 'my_vector' should already be initialized, so we're leaving 'other' in a valid state.
153 }
154 return *this;
155 }
156
161 Ns_::destroy(&my_vector);
162 }
163
164public:
168 igraph_bool_t empty() const {
169 return Ns_::empty(&my_vector);
170 }
171
175 size_type size() const {
176 return Ns_::size(&my_vector);
177 }
178
182 constexpr size_type max_size() const { return IGRAPH_INTEGER_MAX; }
183
188 return my_vector.stor_end - my_vector.stor_begin;
189 }
190
194 void clear() {
195 Ns_::clear(&my_vector);
196 }
197
204 auto old_size = this->size();
205 check_code(Ns_::resize(&my_vector, size));
206 if (old_size < size) {
207 std::fill_n(begin() + old_size, size - old_size, val);
208 }
209 }
210
216 check_code(Ns_::reserve(&my_vector, capacity));
217 }
218
223 Ns_::shrink_to_fit(&my_vector);
224 }
225
231 check_code(Ns_::push_back(&my_vector, val));
232 }
233
238 template<typename ... Args>
239 void emplace_back(Args&& ... args) {
240 // Doesn't really matter for simple types.
241 push_back(value_type(std::forward<Args>(args)...));
242 }
243
247 void pop_back() {
248 Ns_::pop_back(&my_vector);
249 }
250
256 Ns_::remove(&my_vector, pos - begin());
257 return pos;
258 }
259
266 auto start = begin();
267 Ns_::remove_section(&my_vector, first - start, last - start);
268 return first;
269 }
270
278 auto delta = pos - begin();
279 check_code(Ns_::insert(&my_vector, delta, val));
280 return begin() + delta; // recompute it as there might be a reallocation.
281 }
282
289 template<typename ... Args>
290 iterator emplace(iterator pos, Args&& ... args) {
291 // Doesn't really matter for simple types.
292 return insert(pos, value_type(std::forward<Args>(args)...));
293 }
294
303 auto delta = pos - begin();
304 auto old_size = size();
305 resize(old_size + n);
306
307 auto new_start = begin() + delta; // recompute it as there might be a reallocation.
308 std::copy(new_start, begin() + old_size, new_start + n);
309 std::fill_n(new_start, n, val);
310 return new_start;
311 }
312
321 template<typename InputIterator, typename = decltype(*std::declval<InputIterator>())>
322 iterator insert(iterator pos, InputIterator first, InputIterator last) {
323 auto delta = pos - begin();
324 auto old_size = size();
325 auto n = last - first;
326 resize(old_size + n);
327
328 auto new_start = begin() + delta; // recompute it as there might be a reallocation.
329 std::copy(new_start, begin() + old_size, new_start + n);
330 std::copy(first, last, new_start);
331 return new_start;
332 }
333
334public:
339 reference operator[](igraph_int_t i) {
340 return *(begin() + i);
341 }
342
347 const_reference operator[](igraph_int_t i) const {
348 return *(begin() + i);
349 }
350
355 return *(end() - 1);
356 }
357
362 return *(end() - 1);
363 }
364
369 return *(begin());
370 }
371
376 return *(begin());
377 }
378
379public:
384 return my_vector.stor_begin;
385 }
386
391 return my_vector.end;
392 }
393
398 return cbegin();
399 }
400
405 return cend();
406 }
407
412 return my_vector.stor_begin;
413 }
414
419 return my_vector.end;
420 }
421
426 return my_vector.stor_begin;
427 }
428
432 const value_type* data() const {
433 return my_vector.stor_begin;
434 }
435
440 return std::reverse_iterator(end());
441 }
442
447 return std::reverse_iterator(begin());
448 }
449
454 return std::reverse_iterator(end());
455 }
456
461 return std::reverse_iterator(begin());
462 }
463
468 return std::reverse_iterator(cend());
469 }
470
475 return std::reverse_iterator(cbegin());
476 }
477
478public:
483 operator igraph_type*() {
484 return &my_vector;
485 }
486
491 operator const igraph_type*() const {
492 return &my_vector;
493 }
494
500 return &my_vector;
501 }
502
507 const igraph_type* get() const {
508 return &my_vector;
509 }
510
511public:
516 void swap(Vector<Ns_>& other) {
517 // Swapping structures entirely to ensure that iterators and pointers
518 // remain valid; looks like igraph_vector_swap does the same.
519 std::swap(my_vector, other.my_vector);
520 }
521
522private:
523 igraph_type my_vector;
524};
525
529namespace internal {
530
531struct Integer {
532 typedef igraph_int_t value_type;
533 typedef igraph_vector_int_t igraph_type;
534
535#define RAIIGRAPH_VECTOR_SUFFIX _int
536#include "fragments/vector.hpp"
537#undef RAIIGRAPH_VECTOR_SUFFIX
538};
539
540struct Real {
541 typedef igraph_real_t value_type;
542 typedef igraph_vector_t igraph_type;
543
544#define RAIIGRAPH_VECTOR_SUFFIX
545#include "fragments/vector.hpp"
546#undef RAIIGRAPH_VECTOR_SUFFIX
547};
548
549struct Bool {
550 typedef igraph_bool_t value_type;
551 typedef igraph_vector_bool_t igraph_type;
552
553#define RAIIGRAPH_VECTOR_SUFFIX _bool
554#include "fragments/vector.hpp"
555#undef RAIIGRAPH_VECTOR_SUFFIX
556};
557
558}
567
571// For back-compatibility.
572typedef IntVector IntegerVector;
581
586
587}
588
589
590#endif
Wrapper around igraph_vector_*_t objects with RAII behavior.
Definition Vector.hpp:29
iterator erase(iterator pos)
Definition Vector.hpp:255
value_type & reference
Definition Vector.hpp:49
iterator insert(iterator pos, value_type val)
Definition Vector.hpp:277
const value_type * data() const
Definition Vector.hpp:432
Vector & operator=(Vector< Ns_ > &&other)
Definition Vector.hpp:150
value_type * data()
Definition Vector.hpp:425
iterator erase(iterator first, iterator last)
Definition Vector.hpp:265
iterator emplace(iterator pos, Args &&... args)
Definition Vector.hpp:290
iterator begin()
Definition Vector.hpp:383
reverse_const_iterator rend() const
Definition Vector.hpp:460
const value_type & const_reference
Definition Vector.hpp:54
void reserve(size_type capacity)
Definition Vector.hpp:215
std::reverse_iterator< const_iterator > reverse_const_iterator
Definition Vector.hpp:84
Vector< Ns_ > & operator=(const Vector< Ns_ > &other)
Definition Vector.hpp:129
Vector(Vector< Ns_ > &&other)
Definition Vector.hpp:141
reverse_iterator rend()
Definition Vector.hpp:446
const igraph_type * get() const
Definition Vector.hpp:507
igraph_type * get()
Definition Vector.hpp:499
Vector(const Vector< Ns_ > &other)
Definition Vector.hpp:121
reverse_iterator rbegin()
Definition Vector.hpp:439
const_reference back() const
Definition Vector.hpp:361
value_type * iterator
Definition Vector.hpp:69
igraph_bool_t empty() const
Definition Vector.hpp:168
reverse_const_iterator rbegin() const
Definition Vector.hpp:453
const_reference front() const
Definition Vector.hpp:375
reverse_const_iterator crend() const
Definition Vector.hpp:474
void clear()
Definition Vector.hpp:194
~Vector()
Definition Vector.hpp:160
std::reverse_iterator< iterator > reverse_iterator
Definition Vector.hpp:79
Vector()
Definition Vector.hpp:90
const value_type * const_iterator
Definition Vector.hpp:74
const_iterator begin() const
Definition Vector.hpp:397
iterator insert(iterator pos, size_type n, value_type val)
Definition Vector.hpp:302
void emplace_back(Args &&... args)
Definition Vector.hpp:239
iterator insert(iterator pos, InputIterator first, InputIterator last)
Definition Vector.hpp:322
void resize(size_type size, value_type val=value_type())
Definition Vector.hpp:203
const_iterator cbegin() const
Definition Vector.hpp:411
Vector(size_type size, const value_type &val=value_type())
Definition Vector.hpp:96
size_type capacity() const
Definition Vector.hpp:187
void swap(Vector< Ns_ > &other)
Definition Vector.hpp:516
void pop_back()
Definition Vector.hpp:247
reference back()
Definition Vector.hpp:354
reference front()
Definition Vector.hpp:368
iterator end()
Definition Vector.hpp:390
const_reference operator[](igraph_int_t i) const
Definition Vector.hpp:347
reverse_const_iterator crbegin() const
Definition Vector.hpp:467
igraph_int_t difference_type
Definition Vector.hpp:64
size_type size() const
Definition Vector.hpp:175
void push_back(value_type val)
Definition Vector.hpp:230
Vector(igraph_type &&vector)
Definition Vector.hpp:104
reference operator[](igraph_int_t i)
Definition Vector.hpp:339
void shrink_to_fit()
Definition Vector.hpp:222
Vector(InputIterator first, InputIterator last)
Definition Vector.hpp:112
Ns_::igraph_type igraph_type
Definition Vector.hpp:39
const_iterator cend() const
Definition Vector.hpp:418
constexpr size_type max_size() const
Definition Vector.hpp:182
Ns_::value_type value_type
Definition Vector.hpp:44
const_iterator end() const
Definition Vector.hpp:404
igraph_int_t size_type
Definition Vector.hpp:59
Error handling for raiigraph.
Utilities for manipulating igraph data structures in C++.
Definition error.hpp:11
Vector< internal::Integer > IntVector
Definition Vector.hpp:566
Vector< internal::Real > RealVector
Definition Vector.hpp:580
void check_code(igraph_error_t code)
Definition error.hpp:39
Vector< internal::Bool > BoolVector
Definition Vector.hpp:585