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 
34  public:
35  // Construct a new MaxSizeVector, reserve n elements.
37  : reserve_(n), size_(0), data_(static_cast<T*>(internal::handmade_aligned_malloc(n * sizeof(T), alignment))) {}
38 
39  // Construct a new MaxSizeVector, reserve and resize to n.
40  // Copy the init value to all elements.
42  : reserve_(n), size_(n), data_(static_cast<T*>(internal::handmade_aligned_malloc(n * sizeof(T), alignment))) {
43  size_t i = 0;
44  EIGEN_TRY {
45  for (; i < size_; ++i) {
46  new (&data_[i]) T(init);
47  }
48  }
49  EIGEN_CATCH(...) {
50  // Construction failed, destruct in reverse order:
51  for (; (i + 1) > 0; --i) {
52  data_[i - 1].~T();
53  }
56  }
57  }
58 
60  for (size_t i = size_; i > 0; --i) {
61  data_[i - 1].~T();
62  }
64  }
65 
66  void resize(size_t n) {
68  for (; size_ < n; ++size_) {
69  new (&data_[size_]) T;
70  }
71  for (; size_ > n; --size_) {
72  data_[size_ - 1].~T();
73  }
74  eigen_assert(size_ == n);
75  }
76 
77  // Append new elements (up to reserved size).
80  new (&data_[size_++]) T(t);
81  }
82 
83  // For C++03 compatibility this only takes one argument
84  template <class X>
87  new (&data_[size_++]) T(x);
88  }
89 
91  eigen_assert(i < size_);
92  return data_[i];
93  }
94 
96  eigen_assert(i < size_);
97  return data_[i];
98  }
99 
101  eigen_assert(size_ > 0);
102  return data_[size_ - 1];
103  }
104 
106  eigen_assert(size_ > 0);
107  return data_[size_ - 1];
108  }
109 
111  eigen_assert(size_ > 0);
112  data_[--size_].~T();
113  }
114 
115  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t size() const { return size_; }
116 
117  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool empty() const { return size_ == 0; }
118 
120 
121  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr const T* data() const { return data_; }
122 
124 
126 
127  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr const T* begin() const { return data_; }
128 
129  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr const T* end() const { return data_ + size_; }
130 
131  private:
132  size_t reserve_;
133  size_t size_;
135 };
136 
137 } // namespace Eigen
138 
139 #endif // EIGEN_FIXEDSIZEVECTOR_H
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
#define EIGEN_ALIGNOF(x)
Definition: ConfigureVectorization.h:38
Eigen::Triplet< double > T
Definition: EigenUnitTest.cpp:11
#define EIGEN_CATCH(X)
Definition: Macros.h:1264
#define EIGEN_THROW
Definition: Macros.h:1261
#define EIGEN_TRY
Definition: Macros.h:1263
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:892
#define eigen_assert(x)
Definition: Macros.h:910
#define EIGEN_STRONG_INLINE
Definition: Macros.h:834
The MaxSizeVector class.
Definition: MaxSizeVector.h:31
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const T * begin() const
Definition: MaxSizeVector.h:127
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t size() const
Definition: MaxSizeVector.h:115
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const T * end() const
Definition: MaxSizeVector.h:129
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const T * data() const
Definition: MaxSizeVector.h:121
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T & back()
Definition: MaxSizeVector.h:100
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pop_back()
Definition: MaxSizeVector.h:110
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE MaxSizeVector(size_t n)
Definition: MaxSizeVector.h:36
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T & back() const
Definition: MaxSizeVector.h:105
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T & operator[](size_t i)
Definition: MaxSizeVector.h:95
static const size_t alignment
Definition: MaxSizeVector.h:32
size_t size_
Definition: MaxSizeVector.h:133
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void push_back(const T &t)
Definition: MaxSizeVector.h:78
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE MaxSizeVector(size_t n, const T &init)
Definition: MaxSizeVector.h:41
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE T * begin()
Definition: MaxSizeVector.h:123
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T & operator[](size_t i) const
Definition: MaxSizeVector.h:90
void resize(size_t n)
Definition: MaxSizeVector.h:66
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ~MaxSizeVector()
Definition: MaxSizeVector.h:59
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE T * data()
Definition: MaxSizeVector.h:119
size_t reserve_
Definition: MaxSizeVector.h:132
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE T * end()
Definition: MaxSizeVector.h:125
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void emplace_back(const X &x)
Definition: MaxSizeVector.h:85
T * data_
Definition: MaxSizeVector.h:134
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool empty() const
Definition: MaxSizeVector.h:117
#define X
Definition: icosphere.cpp:20
constexpr int plain_enum_max(A a, B b)
Definition: Meta.h:656
EIGEN_DEVICE_FUNC void handmade_aligned_free(void *ptr)
Definition: Memory.h:158
EIGEN_DEVICE_FUNC void * handmade_aligned_malloc(std::size_t size, std::size_t alignment=EIGEN_DEFAULT_ALIGN_BYTES)
Definition: Memory.h:142
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
Definition: Eigen_Colamd.h:49
list x
Definition: plotDoE.py:28
t
Definition: plotPSD.py:36
Definition: TutorialInplaceLU.cpp:2