added schema node iterator
This commit is contained in:
parent
89fb7e8a8d
commit
6a5974337d
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include "matador/object/error_code.hpp"
|
#include "matador/object/error_code.hpp"
|
||||||
#include "matador/object/schema_node.hpp"
|
#include "matador/object/schema_node.hpp"
|
||||||
|
#include "matador/object/schema_node_iterator.hpp"
|
||||||
|
|
||||||
#include "matador/utils/result.hpp"
|
#include "matador/utils/result.hpp"
|
||||||
#include "matador/utils/error.hpp"
|
#include "matador/utils/error.hpp"
|
||||||
|
|
@ -15,6 +16,8 @@ namespace matador::object {
|
||||||
|
|
||||||
class schema {
|
class schema {
|
||||||
public:
|
public:
|
||||||
|
typedef const_schema_node_iterator const_iterator; /**< Shortcut for the list const iterator. */
|
||||||
|
|
||||||
schema();
|
schema();
|
||||||
|
|
||||||
template <typename Type>
|
template <typename Type>
|
||||||
|
|
@ -36,6 +39,20 @@ public:
|
||||||
return utils::ok<void>();
|
return utils::ok<void>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the first schema node.
|
||||||
|
*
|
||||||
|
* @return The first schema node iterator.
|
||||||
|
*/
|
||||||
|
[[nodiscard]] const_iterator begin() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the last schema node.
|
||||||
|
*
|
||||||
|
* @return The last schema node iterator.
|
||||||
|
*/
|
||||||
|
[[nodiscard]] const_iterator end() const;
|
||||||
|
|
||||||
[[nodiscard]] bool empty() const;
|
[[nodiscard]] bool empty() const;
|
||||||
|
|
||||||
[[nodiscard]] size_t size() const;
|
[[nodiscard]] size_t size() const;
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,8 @@ private:
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend schema;
|
friend class schema;
|
||||||
|
friend class const_schema_node_iterator;
|
||||||
|
|
||||||
schema &schema_;
|
schema &schema_;
|
||||||
std::unique_ptr<basic_object_info> info_;
|
std::unique_ptr<basic_object_info> info_;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,130 @@
|
||||||
|
#ifndef SCHEMA_NODE_ITERATOR_HPP
|
||||||
|
#define SCHEMA_NODE_ITERATOR_HPP
|
||||||
|
|
||||||
|
#include "matador/object/schema_node.hpp"
|
||||||
|
|
||||||
|
#include <iterator>
|
||||||
|
|
||||||
|
namespace matador::object {
|
||||||
|
|
||||||
|
class const_schema_node_iterator {
|
||||||
|
public:
|
||||||
|
using iterator_category = std::bidirectional_iterator_tag;
|
||||||
|
using difference_type = std::ptrdiff_t;
|
||||||
|
using value_type = schema_node;
|
||||||
|
using pointer = value_type*;
|
||||||
|
using reference = value_type&;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an empty iterator
|
||||||
|
*/
|
||||||
|
const_schema_node_iterator() = default;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Creates an iterator for a concrete type.
|
||||||
|
*
|
||||||
|
* This constructor creates an iterator for a concrete
|
||||||
|
* type and a concrete object.
|
||||||
|
*
|
||||||
|
* @param node The schema node of the object
|
||||||
|
*/
|
||||||
|
explicit const_schema_node_iterator(std::shared_ptr<value_type> node);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy from a given const_object_view_iterator.
|
||||||
|
*
|
||||||
|
* @param x The prototype_iterator to copy from.
|
||||||
|
*/
|
||||||
|
const_schema_node_iterator(const const_schema_node_iterator &x) = default;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assign from a given prototype_iterator.
|
||||||
|
*
|
||||||
|
* @param x The prototype_iterator to assign from.
|
||||||
|
* @return The assigned prototype_iterator.
|
||||||
|
*/
|
||||||
|
const_schema_node_iterator& operator=(const const_schema_node_iterator &x) = default;
|
||||||
|
|
||||||
|
~const_schema_node_iterator() = default;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Compares this with another iterators.
|
||||||
|
*
|
||||||
|
* Compares this with another iterators. Returns true
|
||||||
|
* if the iterators node prototype_type are the same.
|
||||||
|
*
|
||||||
|
* @param i The iterator to compare with.
|
||||||
|
* @return True if the iterators are the same.
|
||||||
|
*/
|
||||||
|
bool operator==(const const_schema_node_iterator &i) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Compares this with another iterators.
|
||||||
|
*
|
||||||
|
* Compares this with another iterators. Returns true
|
||||||
|
* if the iterators node prototype_node are not the same.
|
||||||
|
*
|
||||||
|
* @param i The iterator to compare with.
|
||||||
|
* @return True if the iterators are not the same.
|
||||||
|
*/
|
||||||
|
bool operator!=(const const_schema_node_iterator &i) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pre increments the iterator
|
||||||
|
*
|
||||||
|
* @return Returns iterators successor.
|
||||||
|
*/
|
||||||
|
const_schema_node_iterator& operator++();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Post increments the iterator
|
||||||
|
*
|
||||||
|
* @return Returns iterator before incrementing.
|
||||||
|
*/
|
||||||
|
const_schema_node_iterator operator++(int);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pre increments the iterator
|
||||||
|
*
|
||||||
|
* @return Returns iterators predecessor.
|
||||||
|
*/
|
||||||
|
const_schema_node_iterator& operator--();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Post decrements the iterator
|
||||||
|
*
|
||||||
|
* @return Returns iterator before decrementing.
|
||||||
|
*/
|
||||||
|
const_schema_node_iterator operator--(int);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the pointer to the node.
|
||||||
|
*
|
||||||
|
* @return The pointer to the node.
|
||||||
|
*/
|
||||||
|
pointer operator->() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the node.
|
||||||
|
*
|
||||||
|
* @return The iterators underlying node.
|
||||||
|
*/
|
||||||
|
const reference operator*() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the pointer to the node.
|
||||||
|
*
|
||||||
|
* @return The pointer to the node.
|
||||||
|
*/
|
||||||
|
[[nodiscard]] pointer get() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void increment();
|
||||||
|
void decrement();
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::shared_ptr<value_type> node_;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif //SCHEMA_NODE_ITERATOR_HPP
|
||||||
|
|
@ -47,6 +47,8 @@ add_library(matador-core STATIC
|
||||||
object/schema.cpp
|
object/schema.cpp
|
||||||
object/schema_node.cpp
|
object/schema_node.cpp
|
||||||
object/basic_object_info.cpp
|
object/basic_object_info.cpp
|
||||||
|
../../include/matador/object/schema_node_iterator.hpp
|
||||||
|
object/schema_node_iterator.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(matador-core ${CMAKE_DL_LIBS})
|
target_link_libraries(matador-core ${CMAKE_DL_LIBS})
|
||||||
|
|
|
||||||
|
|
@ -14,11 +14,21 @@ schema::schema()
|
||||||
root_->last_child_->previous_sibling_ = root_->first_child_;
|
root_->last_child_->previous_sibling_ = root_->first_child_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
schema::const_iterator schema::begin() const {
|
||||||
|
return const_iterator(root_->first_child_->next_sibling_);
|
||||||
|
}
|
||||||
|
|
||||||
|
schema::const_iterator schema::end() const {
|
||||||
|
return const_iterator(root_->last_child_);
|
||||||
|
}
|
||||||
|
|
||||||
bool schema::empty() const {
|
bool schema::empty() const {
|
||||||
return root_->first_child_ == root_->last_child_->previous_sibling_;
|
return root_->first_child_ == root_->last_child_->previous_sibling_;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t schema::size() const { return 0; }
|
size_t schema::size() const {
|
||||||
|
return static_cast<size_t>(std::distance(begin(), end()));
|
||||||
|
}
|
||||||
|
|
||||||
utils::result<std::shared_ptr<schema_node>, utils::error> schema::attach_node(const std::shared_ptr<schema_node> &node,
|
utils::result<std::shared_ptr<schema_node>, utils::error> schema::attach_node(const std::shared_ptr<schema_node> &node,
|
||||||
const std::string &parent) {
|
const std::string &parent) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,106 @@
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
#include "matador/object/schema_node_iterator.hpp"
|
||||||
|
|
||||||
|
namespace matador::object {
|
||||||
|
|
||||||
|
const_schema_node_iterator::const_schema_node_iterator(std::shared_ptr<value_type> node)
|
||||||
|
: node_(std::move(node))
|
||||||
|
{}
|
||||||
|
|
||||||
|
bool const_schema_node_iterator::operator==(const const_schema_node_iterator &i) const
|
||||||
|
{
|
||||||
|
return (node_ == i.node_);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool const_schema_node_iterator::operator!=(const const_schema_node_iterator &i) const
|
||||||
|
{
|
||||||
|
return !operator==(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
const_schema_node_iterator& const_schema_node_iterator::operator++()
|
||||||
|
{
|
||||||
|
increment();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
const_schema_node_iterator const_schema_node_iterator::operator++(int)
|
||||||
|
{
|
||||||
|
const std::shared_ptr<value_type> tmp = node_;
|
||||||
|
increment();
|
||||||
|
return const_schema_node_iterator(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
const_schema_node_iterator& const_schema_node_iterator::operator--()
|
||||||
|
{
|
||||||
|
decrement();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
const_schema_node_iterator const_schema_node_iterator::operator--(int)
|
||||||
|
{
|
||||||
|
const std::shared_ptr<value_type> tmp = node_;
|
||||||
|
decrement();
|
||||||
|
return const_schema_node_iterator(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
const_schema_node_iterator::pointer const_schema_node_iterator::operator->() const
|
||||||
|
{
|
||||||
|
return node_.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
const_schema_node_iterator::reference const_schema_node_iterator::operator*() const
|
||||||
|
{
|
||||||
|
return *node_;
|
||||||
|
}
|
||||||
|
|
||||||
|
const_schema_node_iterator::pointer const_schema_node_iterator::get() const
|
||||||
|
{
|
||||||
|
return node_.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
void const_schema_node_iterator::increment()
|
||||||
|
{
|
||||||
|
if (!node_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we have a child, child is the next iterator to return
|
||||||
|
// (if we don't do iterate over the siblings)
|
||||||
|
if (node_->first_child_ && node_->first_child_->next_sibling_ != node_->last_child_) {
|
||||||
|
node_ = node_->first_child_->next_sibling_;
|
||||||
|
} else {
|
||||||
|
// if there is no child, we check for sibling
|
||||||
|
// if there is a sibling, this is our next iterator to return
|
||||||
|
// if not, we go back to the parent
|
||||||
|
std::shared_ptr<value_type> node = node_;
|
||||||
|
while (node_->parent_ && node_->next_sibling_ == node_->parent_->last_child_) {
|
||||||
|
node = node->parent_;
|
||||||
|
}
|
||||||
|
node_ = node_->next_sibling_;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
void const_schema_node_iterator::decrement()
|
||||||
|
{
|
||||||
|
if (!node_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// if node has a previous sibling, we set it
|
||||||
|
// as our next iterator. then we check if there
|
||||||
|
// are last children. if so, we set the last-last
|
||||||
|
// child as our iterator
|
||||||
|
if (node_->previous_sibling_ && node_->previous_sibling_->previous_sibling_) {
|
||||||
|
std::shared_ptr<value_type> node = node_->previous_sibling_;
|
||||||
|
while (node_->last_child_ && node_->first_child_->next_sibling_ != node_->last_child_) {
|
||||||
|
node = node->last_child_->previous_sibling_;
|
||||||
|
}
|
||||||
|
node_ = node;
|
||||||
|
// if there is no previous sibling, our next iterator
|
||||||
|
// is the parent of the node
|
||||||
|
} else {
|
||||||
|
node_ = node_->parent_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue