14#include <lagrange/utils/assert.h>
18#ifdef LAGRANGE_WITH_PYTHON
25class SharedPtrVector :
public std::vector<std::shared_ptr<T>>
28 using Super = std::vector<std::shared_ptr<T>>;
31 struct Iterator :
public Super::iterator
34 using SuperIt =
typename Super::iterator;
37 using iterator_category = std::input_iterator_tag;
38 using difference_type = std::ptrdiff_t;
44 using SuperIt::SuperIt;
45 Iterator(
const SuperIt& it)
48 Iterator(SuperIt&& it)
49 : SuperIt(std::move(it))
51 const T& operator*()
const {
return *SuperIt::operator*(); }
52 T& operator*() {
return *SuperIt::operator*(); }
55 struct ConstIterator :
public Super::const_iterator
58 using SuperIt =
typename Super::const_iterator;
61 using iterator_category = std::input_iterator_tag;
62 using difference_type = std::ptrdiff_t;
64 using pointer =
const T*;
65 using reference =
const T&;
68 using SuperIt::SuperIt;
69 ConstIterator(
const SuperIt& it)
72 ConstIterator(SuperIt&& it)
73 : SuperIt(std::move(it))
75 const T& operator*()
const {
return *SuperIt::operator*(); }
81 template <
typename InputIter>
82 SharedPtrVector(InputIter first, InputIter last)
84 for (
auto it = first; it != last; ++it) {
85 Super::push_back(std::make_shared<T>(*it));
88 SharedPtrVector(std::initializer_list<T> init)
89 : SharedPtrVector(init.begin(), init.end())
91 SharedPtrVector(
const std::vector<T>& values)
92 : SharedPtrVector(values.begin(), values.end())
94 SharedPtrVector(std::vector<T>&& values)
95 : SharedPtrVector(values.begin(), values.end())
98 void push_back(
const T& value) { Super::emplace_back(std::make_shared<T>(value)); }
99 void push_back(T&& value) { Super::push_back(std::make_shared<T>(std::move(value))); }
100 template <
typename... Args>
101 void emplace_back(Args&&... args)
103 Super::push_back(std::make_shared<T>(std::forward<Args>(args)...));
105 const T& back()
const {
return *Super::back().get(); }
106 T& back() {
return *Super::back().get(); }
107 const T& front()
const {
return *Super::front().get(); }
108 T& front() {
return *Super::front().get(); }
109 const T& operator[](
size_t i)
const {
return *Super::operator[](i).get(); }
110 T& operator[](
size_t i) {
return *Super::operator[](i).get(); }
111 const T& at(
size_t i)
const {
return *Super::at(i).get(); }
112 T& at(
size_t i) {
return *Super::at(i).get(); }
114 Iterator begin() {
return Super::begin(); }
115 Iterator end() {
return Super::end(); }
116 ConstIterator begin()
const {
return Super::begin(); }
117 ConstIterator end()
const {
return Super::end(); }
121struct DerivedVector :
public std::vector<T>
123 using Super = std::vector<T>;
127 DerivedVector(
const std::vector<T>& values)
128 : Super(values.begin(), values.end())
130 DerivedVector(std::vector<T>&& values)
131 : Super(values.begin(), values.end())
137 std::conditional_t<std::is_arithmetic_v<T>, DerivedVector<T>, SharedPtrVector<T>>;
146using SafeVector = std::vector<T>;
Main namespace for Lagrange.