6#ifndef ADOBE_DICTIONARY_ARG_STREAM_HPP
7#define ADOBE_DICTIONARY_ARG_STREAM_HPP
14#include <boost/range/begin.hpp>
15#include <boost/range/end.hpp>
16#include <boost/range/value_type.hpp>
17#include <boost/utility/value_init.hpp>
49template <
typename Dictionary,
typename InputRange ,
50 typename NoThrow =
void >
54 typedef typename boost::range_iterator<InputRange const>::type
iterator;
89template <
typename Dictionary,
typename InputRange ,
90 typename NoThrow =
void >
110 template <
typename R>
118template <
typename Dictionary,
typename InputRange >
124 template <
typename R>
128 R r = boost::initialized_value;
135template <
typename Dictionary,
typename InputRange >
136dictionary_arg_stream<Dictionary, InputRange, void>
141template <
typename Dictionary,
typename InputRange >
142dictionary_arg_stream<Dictionary, InputRange, std::nothrow_t>
156template <
typename Dictionary,
typename Key>
160 static adobe::detail::yes_struct
SFINAE(
int);
165template <
typename Dictionary,
typename Key,
typename R>
170 static adobe::detail::yes_struct
SFINAE(
int);
176template <
typename Dictionary,
typename Range>
180 typename boost::range_value<Range>::type>
::value;
188template <
typename Dictionary,
typename DefaultKey,
192template <
typename Dictionary,
typename DefaultKey>
196template <
typename Dictionary,
typename DefaultKey>
198 typedef typename Dictionary::key_type
type;
205template <
typename NoThrow = std::nothrow_t,
bool isRange = true>
207 template <
typename F,
typename Dictionary,
typename InputRange>
209 InputRange
const& range) {
215 template <
typename F,
typename Dictionary,
typename InputRange>
217 InputRange
const& range) {
224 template <
typename F,
typename Dictionary,
typename Key>
226 Key
const& keyable) {
229 std::pair<key_type const*, key_type const*> key_range(&key, &key + 1);
235 template <
typename F,
typename Dictionary,
typename Key>
237 Key
const& keyable) {
240 std::pair<key_type const*, key_type const*> key_range(&key, &key + 1);
245template <
typename NoThrow,
typename Dictionary,
typename T>
255template <
typename F,
typename Dictionary,
typename SingleArg>
257 SingleArg
const& key_or_key_range) {
259 f, dict, key_or_key_range);
263template <
typename F,
typename Dictionary,
typename SingleArg>
265 Dictionary
const& dict,
266 SingleArg
const& key_or_key_range) {
268 SingleArg>::call(f, dict,
273template <
class T,
typename F,
typename Dictionary,
typename SingleArg>
276 SingleArg
const& key_or_key_range) {
278 that, f, dict, key_or_key_range);
281template <
class T,
typename F,
typename Dictionary,
typename SingleArg>
284 SingleArg
const& key_or_key_range) {
286 SingleArg>::call(that, f, dict,
292template <
typename F,
typename Dictionary,
typename T1,
typename T2>
294 T1
const& key1, T2
const& key2) {
296 std::array<key_type, 2> arr = {key_type(key1), key_type(key2)};
300template <
typename X,
typename F,
typename Dictionary,
typename T1,
typename T2>
304 std::array<key_type, 2> arr = {key_type(key1), key_type(key2)};
308template <
typename F,
typename Dictionary,
typename T1,
typename T2>
312 std::array<key_type, 2> arr = {key_type(key1), key_type(key2)};
316template <
typename X,
typename F,
typename Dictionary,
typename T1,
typename T2>
321 std::array<key_type, 2> arr = {key_type(key1), key_type(key2)};
326template <
typename F,
typename Dictionary,
typename T1,
typename T2,
typename T3>
330 std::array<key_type, 3> arr = {key_type(key1), key_type(key2), key_type(key3)};
334template <
typename X,
typename F,
typename Dictionary,
typename T1,
typename T2,
typename T3>
339 std::array<key_type, 3> arr = {key_type(key1), key_type(key2), key_type(key3)};
343template <
typename F,
typename Dictionary,
typename T1,
typename T2,
typename T3>
348 std::array<key_type, 3> arr = {key_type(key1), key_type(key2), key_type(key3)};
352template <
typename X,
typename F,
typename Dictionary,
typename T1,
typename T2,
typename T3>
355 T2
const& key2, T3
const& key3) {
357 std::array<key_type, 3> arr = {key_type(key1), key_type(key2), key_type(key3)};
362template <
typename F,
typename Dictionary,
typename T1,
typename T2,
typename T3,
typename T4>
364 T1
const& key1, T2
const& key2,
365 T3
const& key3, T4
const& key4) {
367 std::array<key_type, 4> arr = {key_type(key1), key_type(key2), key_type(key3), key_type(key4)};
371template <
typename X,
typename F,
typename Dictionary,
typename T1,
typename T2,
typename T3,
375 T3
const& key3, T4
const& key4) {
377 std::array<key_type, 4> arr = {key_type(key1), key_type(key2), key_type(key3), key_type(key4)};
381template <
typename F,
typename Dictionary,
typename T1,
typename T2,
typename T3,
typename T4>
384 T3
const& key3, T4
const& key4) {
386 std::array<key_type, 4> arr = {key_type(key1), key_type(key2), key_type(key3), key_type(key4)};
390template <
typename X,
typename F,
typename Dictionary,
typename T1,
typename T2,
typename T3,
394 T2
const& key2, T3
const& key3, T4
const& key4) {
396 std::array<key_type, 4> arr = {key_type(key1), key_type(key2), key_type(key3), key_type(key4)};
result_type< F >::type call(F f, ArgStream &astream)
Calls function/callable-object f with function arguments supplied by the arg_stream.
R get_dictionary_entry(adobe::dictionary_t const &dict, adobe::name_t const &key)
dictionary_arg_stream requires specializations of get_dictionary_entry for the dictionary....
arg_stream::result_type< F >::type call_with_dictionary(F f, Dictionary const &dict, SingleArg const &key_or_key_range)
call the function/callable-object f with args pulled from dictionary dict via keys from key_range
#define ADOBE_HAS_TYPE_IMPL(TypeInQuestion)
Implementation part of ADOBE_HAS_TYPE macro. Required before using ADOBE_HAS_TYPE.
#define ADOBE_HAS_TYPE(C, TypeInQuestion)
returns true iff C has an internal type named 'TypeInQuestion'. ie returns true iff C::TypeInQuestion...
function_not_present get_dictionary_entry(...)
closed_hash_map< name_t, any_regular_t > dictionary_t
bool get_value(const dictionary_t &dict, name_t key, T &value)
dictionary_arg_stream< Dictionary, InputRange, void > make_dictionary_arg_stream(Dictionary &dict, InputRange const &key_range)
arg_stream::result_type< F >::type call_member_with_dictionary(T *that, F f, Dictionary const &dict, SingleArg const &key_or_key_range)
boost::function_types::result_type< typenamesignature< F >::type >::type type
void throw_if_eof() const
boost::range_iterator< InputRangeconst >::type iterator
dictionary_arg_stream_base(dictionary_type &d, range_type const &key_range)
Dictionary dictionary_type
static adobe::detail::yes_struct SFINAE(int)
static adobe::detail::no_struct SFINAE(function_not_present const &)
static adobe::detail::yes_struct SFINAE(int)
static adobe::detail::no_struct SFINAE(function_not_present const &)
static arg_stream::result_type< F >::type call(F f, Dictionary const &dict, Key const &keyable)
static arg_stream::result_type< F >::type call(F f, Dictionary const &dict, Key const &keyable)
static arg_stream::result_type< F >::type call(F f, Dictionary const &dict, InputRange const &range)
static arg_stream::result_type< F >::type call(F f, Dictionary const &dict, InputRange const &range)
Dictionary::key_type type
dictionary_arg_stream implements the arg_stream interface
void throw_if_eof() const
dictionary_arg_stream(Dictionary &d, InputRange const &key_range)
dictionary_arg_stream_base< Dictionary, InputRange > _inherited
A character string class for immutable strings.