11 #include <aliceVision/types.hpp>
18 template <
class T,
bool IsConstant>
21 using mapType = std::map<IndexT, std::shared_ptr<T>>;
22 using baseIterator = std::conditional_t<IsConstant,
23 typename mapType::const_iterator,
24 typename mapType::iterator>;
26 using keyType =
const IndexT;
27 using valueType = std::conditional_t<IsConstant, const T, T>;
28 using pairType = std::conditional_t<IsConstant,
29 const std::pair<const IndexT, T>,
30 std::pair<const IndexT, T>>;
37 template <
class T,
bool IsConstant>
43 explicit ProxyPair(Traits::baseIterator it)
48 Traits::baseIterator getIterator()
const
53 Traits::keyType & first()
const
58 Traits::valueType & second()
const
60 return *(_it->second);
64 template<std::
size_t I>
65 decltype(
auto) get()
const
71 else if constexpr (I == 1)
77 static_assert(I < 2,
"Index out of bounds");
84 Traits::baseIterator _it;
92 template <
class T,
bool IsConstant>
97 using iterator_category = std::forward_iterator_tag;
98 using value_type = Traits::pairType;
99 using difference_type = ptrdiff_t;
100 using pointer = void;
105 ValueIteratorT(Traits::baseIterator current, Traits::baseIterator end)
106 : _current(current), _end(end), _pair(current)
131 return _current == other._current;
136 return !(*
this == other);
139 const std::pair<const IndexT, std::shared_ptr<T>>& raw()
const {
143 Traits::baseIterator baseIterator()
const
149 void nextWhileInvalid()
151 while (_current != _end)
153 if (_current->second !=
nullptr)
161 if (_current != _end)
168 Traits::baseIterator _current;
169 Traits::baseIterator _end;
177 template <
typename T,
bool IsConstant>
184 RangeValueT(Traits::baseIterator begin_, Traits::baseIterator end_)
185 : _begin(begin_), _end(end_)
201 Traits::baseIterator _begin;
202 Traits::baseIterator _end;
209 template <
typename T,
bool IsConstant>
216 RangeBaseT(Traits::baseIterator begin_, Traits::baseIterator end_)
217 : _begin(begin_), _end(end_)
222 Traits::baseIterator begin()
227 Traits::baseIterator end()
233 Traits::baseIterator _begin;
234 Traits::baseIterator _end;
242 template <
class T,
bool ForceValueIterator = false>
246 using mapType = std::map<IndexT, std::shared_ptr<T>>;
260 for (
const auto & [key, value] : other.baseRange())
262 this->emplace(key, value->clone());
282 return !(*
this == other);
288 if (this->size() != other.size())
294 for (
const auto & [key, value]: other)
297 const auto it = this->mapType::find(key);
298 if (it == this->mapType::end())
304 const auto sptr = it->second;
305 if (sptr ==
nullptr && value ==
nullptr)
311 if (sptr ==
nullptr || value ==
nullptr)
317 if (!((*sptr) == (*value)))
326 bool isValid(
const IndexT &key)
const
329 auto it = this->mapType::find(key);
330 if (it == this->mapType::end())
336 return (it->second !=
nullptr);
340 void assign(
const IndexT & key,
const T & value)
342 std::shared_ptr<T> ptr;
345 auto it = this->mapType::find(key);
346 if (it != this->mapType::end())
353 ptr = std::make_shared<T>(value);
354 this->insert_or_assign(key, ptr);
370 return RangeValue(mapType::begin(), mapType::end());
380 return RangeBase(mapType::begin(), mapType::end());
384 T & operator[] (
const IndexT& index)
386 std::shared_ptr<T> ptr;
389 auto it = this->mapType::find(index);
390 if (it != this->mapType::end())
397 ptr = std::make_shared<T>();
398 this->insert_or_assign(index, ptr);
404 T & operator[] (IndexT&& index)
406 std::shared_ptr<T> ptr;
409 auto it = this->mapType::find(index);
410 if (it != this->mapType::end())
417 ptr = std::make_shared<T>();
418 this->insert_or_assign(index, ptr);
426 if constexpr (ForceValueIterator)
432 return mapType::begin();
438 if constexpr (ForceValueIterator)
444 return mapType::end();
450 if constexpr (ForceValueIterator)
456 return mapType::begin();
462 if constexpr (ForceValueIterator)
468 return mapType::end();
472 auto find(IndexT index)
474 if constexpr (ForceValueIterator)
480 return mapType::find(index);
484 auto find(IndexT index)
const
486 if constexpr (ForceValueIterator)
492 return mapType::find(index);
496 std::vector<IndexT> getKeys()
const
498 std::vector<IndexT> keys;
499 for (
const auto& pair : *
this)
501 keys.push_back(pair.first);
507 std::vector<std::shared_ptr<T>> getValues()
const
509 std::vector<std::shared_ptr<T>> values;
510 for (
const auto& pair : *
this)
512 values.push_back(pair.second);
525 template <
class T,
bool IsConstant>
526 struct tuple_size<
aliceVision::sfmData::ProxyPair<T, IsConstant>> :
527 std::integral_constant<std::size_t, 2> {};
529 template<
class T,
bool IsConstant>
530 struct tuple_element<0,
aliceVision::sfmData::ProxyPair<T, IsConstant>> {
531 using type = aliceVision::sfmData::MapTraits<T, IsConstant>::keyType&;
534 template<
class T,
bool IsConstant>
535 struct tuple_element<1,
aliceVision::sfmData::ProxyPair<T, IsConstant>> {
536 using type = aliceVision::sfmData::MapTraits<T, IsConstant>::valueType&;