MaxSizeVector.h
Go to the documentation of this file.
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2014 Benoit Steiner <benoit.steiner.goog@gmail.com>
5 //
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 
10 #ifndef EIGEN_FIXEDSIZEVECTOR_H
11 #define EIGEN_FIXEDSIZEVECTOR_H
12 
13 namespace Eigen {
14 
30 template <typename T>
32  static const size_t alignment = internal::plain_enum_max(EIGEN_ALIGNOF(T), sizeof(void*));
33  public:
34  // Construct a new MaxSizeVector, reserve n elements.
35  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
36  explicit MaxSizeVector(size_t n)
37  : reserve_(n), size_(0),
38  data_(static_cast<T*>(internal::handmade_aligned_malloc(n * sizeof(T), alignment))) {
39  }
40 
41  // Construct a new MaxSizeVector, reserve and resize to n.
42  // Copy the init value to all elements.
43  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
44  MaxSizeVector(size_t n, const T& init)
45  : reserve_(n), size_(n),
46  data_(static_cast<T*>(internal::handmade_aligned_malloc(n * sizeof(T), alignment))) {
47  size_t i = 0;
48  EIGEN_TRY
49  {
50  for(; i < size_; ++i) { new (&data_[i]) T(init); }
51  }
52  EIGEN_CATCH(...)
53  {
54  // Construction failed, destruct in reverse order:
55  for(; (i+1) > 0; --i) { data_[i-1].~T(); }
58  }
59  }
60 
61  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
63  for (size_t i = size_; i > 0; --i) {
64  data_[i-1].~T();
65  }
67  }
68 
69  void resize(size_t n) {
71  for (; size_ < n; ++size_) {
72  new (&data_[size_]) T;
73  }
74  for (; size_ > n; --size_) {
75  data_[size_-1].~T();
76  }
77  eigen_assert(size_ == n);
78  }
79 
80  // Append new elements (up to reserved size).
81  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
82  void push_back(const T& t) {
84  new (&data_[size_++]) T(t);
85  }
86 
87  // For C++03 compatibility this only takes one argument
88  template<class X>
89  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
90  void emplace_back(const X& x) {
92  new (&data_[size_++]) T(x);
93  }
94 
95 
96  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
97  const T& operator[] (size_t i) const {
98  eigen_assert(i < size_);
99  return data_[i];
100  }
101 
102  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
103  T& operator[] (size_t i) {
104  eigen_assert(i < size_);
105  return data_[i];
106  }
107 
108  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
109  T& back() {
110  eigen_assert(size_ > 0);
111  return data_[size_ - 1];
112  }
113 
114  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
115  const T& back() const {
116  eigen_assert(size_ > 0);
117  return data_[size_ - 1];
118  }
119 
120  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
121  void pop_back() {
122  eigen_assert(size_ > 0);
123  data_[--size_].~T();
124  }
125 
126  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
127  size_t size() const { return size_; }
128 
129  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
130  bool empty() const { return size_ == 0; }
131 
132  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
133  T* data() { return data_; }
134 
135  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
136  const T* data() const { return data_; }
137 
138  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
139  T* begin() { return data_; }
140 
141  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
142  T* end() { return data_ + size_; }
143 
144  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
145  const T* begin() const { return data_; }
146 
147  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
148  const T* end() const { return data_ + size_; }
149 
150  private:
151  size_t reserve_;
152  size_t size_;
154 };
155 
156 } // namespace Eigen
157 
158 #endif // EIGEN_FIXEDSIZEVECTOR_H
int n
#define EIGEN_ALIGNOF(x)
#define EIGEN_CATCH(X)
Definition: Macros.h:1256
#define EIGEN_THROW
Definition: Macros.h:1253
#define EIGEN_TRY
Definition: Macros.h:1255
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:883
#define eigen_assert(x)
Definition: Macros.h:902
Eigen::Triplet< double > T
The MaxSizeVector class.
Definition: MaxSizeVector.h:31
const T & back() const
size_t size() const
void push_back(const T &t)
Definition: MaxSizeVector.h:82
MaxSizeVector(size_t n, const T &init)
Definition: MaxSizeVector.h:44
static const size_t alignment
Definition: MaxSizeVector.h:32
void resize(size_t n)
Definition: MaxSizeVector.h:69
const T * begin() const
const T * data() const
const T * end() const
const T & operator[](size_t i) const
Definition: MaxSizeVector.h:97
void emplace_back(const X &x)
Definition: MaxSizeVector.h:90
constexpr int plain_enum_max(A a, B b)
Definition: Meta.h:524
void handmade_aligned_free(void *ptr)
Definition: Memory.h:165
void * handmade_aligned_malloc(std::size_t size, std::size_t alignment=EIGEN_DEFAULT_ALIGN_BYTES)
Definition: Memory.h:150
: InteropHeaders
Definition: Core:139