LibraryLink Utilities  3.0.1
Modern C++ wrapper over LibraryLink and WSTP
DataList.hpp
Go to the documentation of this file.
1 
7 #ifndef LLU_CONTAINERS_ITERATORS_DATALIST_HPP
8 #define LLU_CONTAINERS_ITERATORS_DATALIST_HPP
9 
10 #include <iterator>
11 #include <list>
12 #include <string>
13 
16 #include "LLU/MArgument.h"
17 
18 namespace LLU {
19 
20  namespace Detail {
21  struct DataListIteratorPrimitive {
22  using iterator_category = std::input_iterator_tag;
23  using pointer = void*;
24  using difference_type = mint;
25 
26  GenericDataNode node;
27 
28  explicit DataListIteratorPrimitive(DataStoreNode n) : node{n} {}
29 
30  explicit DataListIteratorPrimitive(const DataStoreIterator& it) : node{*it} {}
31 
32  friend bool operator==(const DataListIteratorPrimitive& lhs, const DataListIteratorPrimitive& rhs) {
33  return lhs.node.node == rhs.node.node;
34  }
35  friend bool operator!=(const DataListIteratorPrimitive& lhs, const DataListIteratorPrimitive& rhs) {
36  return !(lhs == rhs);
37  }
38  };
39  } // namespace Detail
40 
45  template<typename T>
46  struct NodeIterator : Detail::DataListIteratorPrimitive {
49 
52 
53  using DataListIteratorPrimitive::DataListIteratorPrimitive;
54 
59  reference operator*() const {
60  return reference {node};
61  }
62 
68  node = node.next();
69  return *this;
70  }
71 
77  NodeIterator tmp {node};
78  ++(*this);
79  return tmp;
80  }
81  };
82 
87  struct NodeNameIterator : Detail::DataListIteratorPrimitive {
88 
90  using value_type = std::string_view;
91 
94 
95  using DataListIteratorPrimitive::DataListIteratorPrimitive;
96 
102  template<typename T>
103  explicit NodeNameIterator(const NodeIterator<T>& it) : DataListIteratorPrimitive {it} {}
104 
110  return node.name();
111  }
112 
118  node = node.next();
119  return *this;
120  }
121 
127  NodeNameIterator tmp {node.node};
128  ++(*this);
129  return tmp;
130  }
131  };
132 
137  template<typename T>
138  struct NodeValueIterator : Detail::DataListIteratorPrimitive {
140  using value_type = T;
141 
144 
145  using DataListIteratorPrimitive::DataListIteratorPrimitive;
146 
151  explicit NodeValueIterator(const NodeIterator<T>& it) : DataListIteratorPrimitive {it} {}
152 
159  if constexpr (std::is_same_v<T, Argument::Typed::Any>) {
160  return node.value();
161  } else {
162  return as<T>();
163  }
164  }
165 
171  node = node.next();
172  return *this;
173  }
174 
180  NodeValueIterator tmp {node.node};
181  ++(*this);
182  return tmp;
183  }
184 
190  template<typename U>
191  U as() const {
192  auto v = node.value();
193  auto* ptr = std::get_if<U>(std::addressof(v));
194  if (!ptr) {
196  }
197  return std::move(*ptr);
198  }
199  };
200 
201 } // namespace LLU
202 
203 #endif // LLU_CONTAINERS_ITERATORS_DATALIST_HPP
LLU::NodeIterator::operator++
NodeIterator & operator++()
Pre-increment operator.
Definition: DataList.hpp:67
LLU::ErrorName::DLInvalidNodeType
const std::string DLInvalidNodeType
DataStoreNode passed to Node wrapper carries data of invalid type.
LLU::DataNode
Wrapper over DataStoreNode structure from LibraryLink.
Definition: DataNode.hpp:22
LLU::NodeNameIterator::operator*
reference operator*() const
Get name of the currently pointed to node.
Definition: DataList.hpp:109
LLU
Main namespace of LibraryLink Utilities.
Definition: Queue.h:13
LLU::NodeValueIterator::reference
value_type reference
NodeValueIterator is a proxy iterator and so the reference type is the same as value_type.
Definition: DataList.hpp:143
LLU::NodeIterator::value_type
DataNode< T > value_type
This iterator iterates over values of type DataNode<T>
Definition: DataList.hpp:48
LLU::NodeNameIterator
Simple proxy input iterator that goes over a DataStore and returns node names when dereferenced.
Definition: DataList.hpp:87
LLU::NodeValueIterator::operator*
reference operator*() const
Get value of the currently pointed to node Generic node values will be converted to T if it is their ...
Definition: DataList.hpp:158
LLU::NodeValueIterator::as
U as() const
Get current node value if it actually is of type U.
Definition: DataList.hpp:191
LLU::NodeValueIterator::operator++
NodeValueIterator & operator++()
Pre-increment operator.
Definition: DataList.hpp:170
LLU::NodeNameIterator::operator++
NodeNameIterator operator++(int)
Post-increment operator.
Definition: DataList.hpp:126
LLU::ErrorManager::throwException
static void throwException(const std::string &errorName, T &&... args)
Throw exception with given name.
Definition: ErrorManager.h:199
LLU::NodeValueIterator::value_type
T value_type
This iterator iterates over node values of type T.
Definition: DataList.hpp:140
LLU::NodeNameIterator::operator++
NodeNameIterator & operator++()
Pre-increment operator.
Definition: DataList.hpp:117
LLU::NodeNameIterator::value_type
std::string_view value_type
This iterator iterates over node names which are represented by std::string_view.
Definition: DataList.hpp:90
LLU::NodeValueIterator::operator++
NodeValueIterator operator++(int)
Post-increment operator.
Definition: DataList.hpp:179
LLU::NodeNameIterator::NodeNameIterator
NodeNameIterator(const NodeIterator< T > &it)
Create NodeNameIterator pointing to the same node as given NodeIterator<T>
Definition: DataList.hpp:103
DataNode.hpp
MArgument.h
Template class and utilities to work with MArgument in type-safe manner.
LLU::NodeValueIterator::NodeValueIterator
NodeValueIterator(const NodeIterator< T > &it)
Create NodeValueIterator pointing to the same node as given NodeIterator<T>
Definition: DataList.hpp:151
LLU::NodeNameIterator::reference
value_type reference
NodeIterator is a proxy iterator and so the reference type is the same as value_type.
Definition: DataList.hpp:93
DataStore.hpp
LLU::NodeIterator
Simple proxy input iterator that goes over a DataStore and returns proxy DataNodes when dereferenced.
Definition: DataList.hpp:46
LLU::NodeValueIterator
Simple proxy input iterator that goes over a DataStore and returns node values of requested type when...
Definition: DataList.hpp:138
LLU::NodeIterator::operator++
NodeIterator operator++(int)
Post-increment operator.
Definition: DataList.hpp:76
LLU::NodeIterator::operator*
reference operator*() const
Get current proxy DataNode.
Definition: DataList.hpp:59