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 = EIGEN_PLAIN_ENUM_MAX(EIGEN_ALIGNOF(T), sizeof(void*));
33  public:
34  // Construct a new MaxSizeVector, reserve n elements.
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.
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 
63  for (size_t i = size_; i > 0; --i) {
64  data_[i-1].~T();
65  }
67  }
68 
69  void resize(size_t n) {
70  eigen_assert(n <= reserve_);
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).
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>
90  void emplace_back(const X& x) {
92  new (&data_[size_++]) T(x);
93  }
94 
95 
97  const T& operator[] (size_t i) const {
98  eigen_assert(i < size_);
99  return data_[i];
100  }
101 
103  T& operator[] (size_t i) {
104  eigen_assert(i < size_);
105  return data_[i];
106  }
107 
109  T& back() {
110  eigen_assert(size_ > 0);
111  return data_[size_ - 1];
112  }
113 
115  const T& back() const {
116  eigen_assert(size_ > 0);
117  return data_[size_ - 1];
118  }
119 
121  void pop_back() {
122  eigen_assert(size_ > 0);
123  data_[--size_].~T();
124  }
125 
127  size_t size() const { return size_; }
128 
130  bool empty() const { return size_ == 0; }
131 
133  T* data() { return data_; }
134 
136  const T* data() const { return data_; }
137 
139  T* begin() { return data_; }
140 
142  T* end() { return data_ + size_; }
143 
145  const T* begin() const { return data_; }
146 
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
#define EIGEN_STRONG_INLINE
Definition: Macros.h:917
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T * end()
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t size() const
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE MaxSizeVector(size_t n)
Definition: MaxSizeVector.h:36
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void push_back(const T &t)
Definition: MaxSizeVector.h:82
int n
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void emplace_back(const X &x)
Definition: MaxSizeVector.h:90
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T * data() const
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T * begin() const
#define EIGEN_PLAIN_ENUM_MAX(a, b)
Definition: Macros.h:1289
Namespace containing all symbols from the Eigen library.
Definition: jet.h:637
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool empty() const
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T & back()
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T & operator[](size_t i) const
Definition: MaxSizeVector.h:97
EIGEN_DEVICE_FUNC void handmade_aligned_free(void *ptr)
Definition: Memory.h:114
void resize(size_t n)
Definition: MaxSizeVector.h:69
EIGEN_DEVICE_FUNC void * handmade_aligned_malloc(std::size_t size, std::size_t alignment=EIGEN_DEFAULT_ALIGN_BYTES)
Definition: Memory.h:100
#define EIGEN_CATCH(X)
Definition: Macros.h:1407
#define eigen_assert(x)
Definition: Macros.h:1037
Eigen::Triplet< double > T
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:976
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T * begin()
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T * data()
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pop_back()
#define EIGEN_TRY
Definition: Macros.h:1406
The MaxSizeVector class.
Definition: MaxSizeVector.h:31
static const size_t alignment
Definition: MaxSizeVector.h:32
#define X
Definition: icosphere.cpp:20
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ~MaxSizeVector()
Definition: MaxSizeVector.h:62
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy x
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T * end() const
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE MaxSizeVector(size_t n, const T &init)
Definition: MaxSizeVector.h:44
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T & back() const
#define EIGEN_THROW
Definition: Macros.h:1404
Point2 t(10, 10)


gtsam
Author(s):
autogenerated on Tue Jul 4 2023 02:34:54