24 #ifndef GRAPHLAB_UTIL_EMPTY_HPP
25 #define GRAPHLAB_UTIL_EMPTY_HPP
29 #include <graphlab/serialization/iarchive.hpp>
30 #include <graphlab/serialization/oarchive.hpp>
34 void save(oarchive&)
const { }
35 void load(iarchive&) { }
36 empty& operator+=(
const empty&) {
return *
this; }
45 class vector<graphlab::empty, allocator<graphlab::empty> > {
52 typedef int difference_type;
53 typedef graphlab::empty value_type;
54 typedef graphlab::empty* pointer;
55 typedef graphlab::empty& reference;
56 typedef const graphlab::empty& const_reference;
57 typedef random_access_iterator_tag iterator_category;
60 size_t i;
const size_t* len;
61 iterator(): i(0),len(NULL) { }
62 iterator(
size_t i,
const size_t* len): i(i), len(len) { }
63 bool operator==(
const iterator& iter)
const {
66 bool operator!=(
const iterator& iter)
const {
67 return !((*this) == iter);
69 iterator operator++() {
73 reference operator*() {
76 const_reference operator*()
const {
79 iterator operator++(
int) {
80 iterator old = (*this);
84 iterator operator--() {
88 iterator operator--(
int) {
89 iterator old = (*this);
93 iterator operator+=(
int n) {
95 if (n > 0 && i > (*len)) i = (*len);
96 else if (n < 0 && i > (*len)) i = 0;
99 iterator operator-=(
int n) {
103 iterator operator+(
int n)
const {
104 iterator tmp = (*this);
108 iterator operator-(
int n)
const {
109 iterator tmp = (*this);
114 int operator-(iterator n)
const {
118 bool operator<(iterator other)
const {
121 bool operator<=(iterator other)
const {
124 bool operator>(iterator other)
const {
127 bool operator>=(iterator other)
const {
132 typedef iterator const_iterator;
133 typedef iterator reverse_iterator;
134 typedef iterator const_reverse_iterator;
135 typedef graphlab::empty& reference;
136 typedef const graphlab::empty& const_reference;
137 typedef allocator<graphlab::empty> allocator_type;
140 explicit vector(
const allocator_type& a = allocator_type()):len(0) { }
142 explicit vector(
size_t n,
const graphlab::empty& val = graphlab::empty(),
143 const allocator_type& a = allocator_type()):len(n) { }
145 template <
typename InputIterator>
146 vector(InputIterator first, InputIterator last,
147 const allocator_type& a = allocator_type()): len(std::distance(first, last)) { }
149 vector(
const vector<graphlab::empty, allocator_type>& v): len(v.len) { };
152 return iterator(0, &len);
155 return iterator(len, &len);
157 const_iterator begin()
const {
158 return const_iterator(0, &len);
160 const_iterator end()
const {
161 return const_iterator(len, &len);
164 reverse_iterator rbegin() {
165 return iterator(0, &len);
167 reverse_iterator rend() {
168 return iterator(len, &len);
170 const_reverse_iterator rbegin()
const {
171 return const_iterator(0, &len);
173 const_reverse_iterator rend()
const {
174 return const_iterator(len, &len);
177 size_t size()
const {
181 size_t capacity()
const {
189 void resize(
size_t s,
const graphlab::empty& e = graphlab::empty()) { len = s; }
191 void reserve(
size_t s) {}
193 reference operator[](
int i) {
197 const_reference operator[](
int i)
const {
201 reference at(
int i) {
202 if (i < 0 || (
size_t)i >= len)
throw std::out_of_range(
"vector index out of range");
206 const_reference at(
int i)
const {
207 if (i < 0 || (
size_t)i >= len)
throw std::out_of_range(
"vector index out of range");
211 template <
typename InputIterator>
212 void assign(InputIterator first, InputIterator last) {
213 len = std::distance(first, last);
217 void assign(
size_t n,
const graphlab::empty&) {
221 void push_back(
const graphlab::empty&) {
225 void pop_back(
const graphlab::empty&) {
229 void insert(iterator,
const graphlab::empty&) {
234 void insert(iterator,
size_t n,
const graphlab::empty&) {
239 template <
typename InputIterator>
240 void insert(iterator, InputIterator first, InputIterator last) {
241 len += std::distance(first, last);
244 void erase(iterator) {
248 void erase(iterator first, iterator last) {
249 len -= (last - first);
252 void swap(vector<graphlab::empty, allocator_type> &v) {
253 std::swap(len, v.len);
260 allocator_type get_allocator()
const {
261 return allocator_type();
274 END_OUT_OF_PLACE_SAVE()
278 END_OUT_OF_PLACE_LOAD()