LibraryLink Utilities  3.0.1
Modern C++ wrapper over LibraryLink and WSTP
Iterators/DataStore.hpp
Go to the documentation of this file.
1 
7 #ifndef LLU_CONTAINERS_ITERATORS_DATASTORE_HPP
8 #define LLU_CONTAINERS_ITERATORS_DATASTORE_HPP
9 
10 #include <iterator>
11 
12 #include "LLU/LibraryData.h"
13 #include "LLU/MArgument.h"
14 #include "LLU/TypedMArgument.h"
15 
16 namespace LLU {
17 
22  struct GenericDataNode {
24  DataStoreNode node;
25 
30  GenericDataNode next() const noexcept;
31 
36  MArgumentType type() const noexcept;
37 
42  std::string_view name() const noexcept;
43 
48  [[nodiscard]] Argument::TypedArgument value() const;
49 
50  // defined in Containers/Generic/DataStore.hpp because the definition of GenericDataList must be available
56  template<typename T>
57  T as() const;
58 
63  explicit operator bool() const;
64 
66  GenericDataNode* operator->() {
67  return this;
68  }
69  };
70 
76  DataStoreNode node;
77 
78  public:
81 
84 
86  using iterator_category = std::input_iterator_tag;
87 
90 
92  using difference_type = mint;
93 
95  explicit DataStoreIterator(DataStoreNode n) : node{n} {}
96 
102  return reference {node};
103  }
104 
109  pointer operator->() const {
110  return pointer {node};
111  }
112 
118  node = LLU::LibraryData::DataStoreAPI()->DataStoreNode_getNextNode(node);
119  return *this;
120  }
121 
127  DataStoreIterator tmp {node};
128  ++(*this);
129  return tmp;
130  }
131 
138  friend bool operator==(const DataStoreIterator& lhs, const DataStoreIterator& rhs) {
139  return lhs.node == rhs.node;
140  }
141 
148  friend bool operator!=(const DataStoreIterator& lhs, const DataStoreIterator& rhs) {
149  return !(lhs == rhs);
150  }
151  };
152 } // namespace LLU
153 
154 #endif // LLU_CONTAINERS_ITERATORS_DATASTORE_HPP
LLU::Argument::TypedArgument
std::variant< std::monostate, Typed::Boolean, Typed::Integer, Typed::Real, Typed::Complex, Typed::Tensor, Typed::SparseArray, Typed::NumericArray, Typed::Image, Typed::UTF8String, Typed::DataStore > TypedArgument
C++ wrapper over LibraryLink's MArgument, which is a plain union.
Definition: TypedMArgument.h:67
LLU
Main namespace of LibraryLink Utilities.
Definition: Queue.h:13
TypedMArgument.h
LLU::DataStoreIterator::operator!=
friend bool operator!=(const DataStoreIterator &lhs, const DataStoreIterator &rhs)
"Not equal to" operator for DataStoreIterators
Definition: Iterators/DataStore.hpp:148
LibraryData.h
LLU::DataStoreIterator
Proxy input iterator over DataStoreNodes, when dereferenced yields GenericDataNode proxy objects.
Definition: Iterators/DataStore.hpp:75
LLU::GenericDataNode
Basic wrapper over DataStoreNode, provides class-like interface and conversion of the underlying valu...
Definition: Iterators/DataStore.hpp:22
LLU::DataStoreIterator::operator++
DataStoreIterator & operator++()
Pre-increment operator.
Definition: Iterators/DataStore.hpp:117
LLU::GenericDataNode::name
std::string_view name() const noexcept
Get node name.
Definition: DataStore.cpp:20
LLU::DataStoreIterator::value_type
GenericDataNode value_type
This iterator returns proxy objects of type GenericDataNode.
Definition: Iterators/DataStore.hpp:80
LLU::DataStoreIterator::operator*
reference operator*() const
Get proxy object of the current node.
Definition: Iterators/DataStore.hpp:101
LLU::GenericDataNode::node
DataStoreNode node
Raw DataStore node.
Definition: Iterators/DataStore.hpp:24
LLU::GenericDataNode::as
T as() const
Get node value if it is of type T, otherwise throw an exception.
Definition: Generic/DataStore.hpp:233
LLU::DataStoreIterator::operator++
DataStoreIterator operator++(int)
Post-increment operator.
Definition: Iterators/DataStore.hpp:126
LLU::GenericDataNode::next
GenericDataNode next() const noexcept
Get GenericDataNode wrapper over the next node.
Definition: DataStore.cpp:12
LLU::GenericDataNode::type
MArgumentType type() const noexcept
Get type of the node value.
Definition: DataStore.cpp:16
LLU::DataStoreIterator::iterator_category
std::input_iterator_tag iterator_category
As with all proxy iterators, DataStoreIterator is only an input iterator.
Definition: Iterators/DataStore.hpp:86
LLU::DataStoreIterator::DataStoreIterator
DataStoreIterator(DataStoreNode n)
Create a DataStoreIterator pointing to a given node.
Definition: Iterators/DataStore.hpp:95
LLU::MArgumentType
MArgumentType
Strongly type enum with possible types of data stored in MArgument.
Definition: MArgument.h:22
LLU::DataStoreIterator::difference_type
mint difference_type
Provide difference_type as required for input iterators.
Definition: Iterators/DataStore.hpp:92
LLU::LibraryData::DataStoreAPI
static const st_WolframIOLibrary_Functions * DataStoreAPI()
Get a pointer to structure with function pointers to DataStore API.
Definition: LibraryData.cpp:45
MArgument.h
Template class and utilities to work with MArgument in type-safe manner.
LLU::GenericDataNode::value
Argument::TypedArgument value() const
Get value of the node as the variant type.
Definition: DataStore.cpp:26
LLU::DataStoreIterator::operator->
pointer operator->() const
Get proxy object of the current node.
Definition: Iterators/DataStore.hpp:109
LLU::DataStoreIterator::operator==
friend bool operator==(const DataStoreIterator &lhs, const DataStoreIterator &rhs)
"Equal to" operator for DataStoreIterators
Definition: Iterators/DataStore.hpp:138