// Copyright Sebastian Jeckel 2014. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #pragma once #include "react/detail/Defs.h" #include #include #include /***************************************/ REACT_IMPL_BEGIN /**************************************/ /////////////////////////////////////////////////////////////////////////////////////////////////// /// BitField /////////////////////////////////////////////////////////////////////////////////////////////////// template class EnumFlags { public: using FlagsT = typename std::underlying_type::type; template void Set() { flags_ |= 1 << x; } template void Clear() { flags_ &= ~(1 << x); } template bool Test() const { return (flags_ & (1 << x)) != 0; } private: FlagsT flags_ = 0; }; /////////////////////////////////////////////////////////////////////////////////////////////////// /// NodeVector /////////////////////////////////////////////////////////////////////////////////////////////////// template class NodeVector { private: typedef std::vector DataT; public: void Add(TNode& node) { data_.push_back(&node); } void Remove(const TNode& node) { data_.erase(std::find(data_.begin(), data_.end(), &node)); } typedef typename DataT::iterator iterator; typedef typename DataT::const_iterator const_iterator; iterator begin() { return data_.begin(); } iterator end() { return data_.end(); } const_iterator begin() const { return data_.begin(); } const_iterator end() const { return data_.end(); } private: DataT data_; }; /////////////////////////////////////////////////////////////////////////////////////////////////// /// NodeBuffer /////////////////////////////////////////////////////////////////////////////////////////////////// struct SplitTag {}; template class NodeBuffer { public: using DataT = std::array; using iterator = typename DataT::iterator; using const_iterator = typename DataT::const_iterator; static const int split_size = N / 2; NodeBuffer() : size_{ 0 }, front_{ nodes_.begin() }, back_{ nodes_.begin() } {} NodeBuffer(T* node) : size_{ 1 }, front_{ nodes_.begin() }, back_{ nodes_.begin() + 1 } { nodes_[0] = node; } template NodeBuffer(TInput srcBegin, TInput srcEnd) : size_{ std::distance(srcBegin, srcEnd) }, front_{ nodes_.begin() }, back_{ size_ != N ? nodes_.begin() + size_ : nodes_.begin() } { std::copy(srcBegin, srcEnd, front_); } // Other must be full NodeBuffer(NodeBuffer& other, SplitTag) : size_{ split_size }, front_{ nodes_.begin() }, back_{ nodes_.begin() } { for (auto i=0; i