46template <
typename Tp,
bool>
60 template <
typename Storage,
typename Iterator>
61 add_secondary(Storage* _storage, Iterator _itr,
const type& _rhs)
65 (*this)(_storage, _itr, _rhs);
71 template <
typename... Args>
76 (*this)(_rhs, std::forward<Args>(args)...);
82 template <
typename Storage,
typename Iterator,
typename Up>
83 auto operator()(Storage* _storage, Iterator _itr,
const Up& _rhs)
const
87 using map_type =
decay_t<
decltype(_rhs.get_secondary())>;
88 using value_type =
typename map_type::mapped_type;
89 using secondary_data_t = std::tuple<Iterator, const string_t&, value_type>;
90 for(
const auto& _data : _rhs.get_secondary())
92 storage_sfinae(_storage, 0,
93 secondary_data_t{ _itr, _data.first, _data.second });
100 template <
typename... Args>
101 auto operator()(type& _rhs, Args&&... args)
const
103 return sfinae(_rhs, 0, std::forward<Args>(args)...);
109 template <
typename... Args>
113 template <
typename... Args>
114 auto operator()(std::nullptr_t, Args...)
121 template <
typename Up,
typename... Args>
122 auto sfinae(Up& _obj,
int, Args&&... args)
const
123 ->
decltype(_obj.add_secondary(std::forward<Args>(args)...))
125 return _obj.add_secondary(std::forward<Args>(args)...);
131 template <
typename Up,
typename... Args>
132 void sfinae(Up&,
long, Args&&...)
const
138 template <
typename Storage,
typename DataT>
139 auto storage_sfinae(Storage* _storage,
int, DataT&& _data)
const
140 ->
decltype(_storage->append(std::forward<DataT>(_data)))
142 return _storage->append(std::forward<DataT>(_data));
148 template <
typename Storage,
typename DataT>
149 void storage_sfinae(Storage*,
long, DataT&&)
const
156template <
typename Tp>
167 template <
typename Storage,
typename Iterator>
168 add_secondary(Storage* _storage, Iterator _itr,
const type& _rhs)
170 (*this)(_storage, _itr, _rhs);
176 template <
typename... Args>
179 (*this)(_rhs, std::forward<Args>(args)...);
185 template <
typename Storage,
typename Iterator>
186 auto operator()(Storage* _storage, Iterator _itr,
const type& _rhs)
const
188 return storage_sfinae(_storage, _itr, _rhs, 0);
194 template <
typename... Args>
195 auto operator()(type& _rhs, Args&&... args)
const
197 return sfinae(_rhs, 0, std::forward<Args>(args)...);
203 template <
typename... Args>
207 template <
typename... Args>
208 auto operator()(std::nullptr_t, Args...)
215 template <
typename Storage,
typename Iterator,
typename Up>
216 auto storage_sfinae(Storage* _storage, Iterator _itr,
const Up& _rhs,
int)
const
217 ->
decltype(_rhs.get_secondary(), void())
222 using map_type =
decay_t<
decltype(_rhs.get_secondary())>;
223 using value_type =
typename map_type::mapped_type;
224 using secondary_data_t = std::tuple<Iterator, const string_t&, value_type>;
225 for(
const auto& _data : _rhs.get_secondary())
226 _storage->append(secondary_data_t{ _itr, _data.first, _data.second });
232 template <
typename Storage,
typename Iterator>
233 void storage_sfinae(Storage*, Iterator,
const type&,
long)
const
239 template <
typename Up,
typename... Args>
240 auto sfinae(Up& _obj,
int, Args&&... args)
const
241 ->
decltype(_obj.add_secondary(std::forward<Args>(args)...), void())
246 _obj.add_secondary(std::forward<Args>(args)...);
252 template <
typename Up,
typename... Args>
253 void sfinae(Up&,
long, Args&&...)
const
276template <
typename Tp>
282 using base_type = internal::add_secondary<Tp, trait::secondary_data<Tp>::value>;
293 template <
typename Storage,
typename Iterator>
301 template <
typename... Args>
309 template <
typename... Args>
typename std::decay< T >::type decay_t
Alias template for decay.
tim::mpl::apply< std::string > string
The declaration for the types for operations without definitions.
Include the macros for operations.
Declare the operations types.
component contains secondary data resembling the original data but should be another node entry in th...
internal::add_secondary< Tp, trait::secondary_data< Tp >::value > base_type
add_secondary(type &_rhs, Args &&... args)
add_secondary(std::nullptr_t, Args...)
add_secondary(Storage *_storage, Iterator _itr, const type &_rhs)
This operation attempts to call a member function which provides a pointer to a component which exist...
typename typename typename