38 bool add_group(
const std::string& group_name,
const std::set<T>& set)
40 const auto itr =
groups.find(group_name);
51 bool contains(
const std::string& group_name)
const
53 return groups.count(group_name) > 0;
61 auto itr =
groups.find(group_name);
66 return &(itr->second);
69 std::map<std::string, std::set<T>>
groups;
80 using string_t =
typename generic_type::string_view;
89 { exprtk::rtl::io::file::details::perform_check<T>(); }
93 const std::string group_name = to_str(
string_t(parameters[0]));
104 const std::size_t ptr_size =
sizeof(ptr);
107 std::memcpy(
reinterpret_cast<char*
>(&result ),
108 reinterpret_cast<char*
>(&ptr),
117template <
typename SetType,
typename T>
120 const std::size_t ptr_size =
sizeof(SetType*);
121 SetType* ptr =
reinterpret_cast<SetType*
>(0);
138 using scalar_t =
typename generic_type::scalar_view;
139 using string_t =
typename generic_type::string_view;
147 { exprtk::rtl::io::file::details::perform_check<T>(); }
151 auto ptr =
scalar_t(parameters[0])();
153 auto& set = *make_set_handle<strgrps_cllctn::set_t>(ptr);
154 return process(set, parameters);
161 for (std::size_t i = 1; i < parameters.size(); ++i)
163 set.insert(to_str(
string_t(parameters[i])));
180 using scalar_t =
typename generic_type::scalar_view;
181 using string_t =
typename generic_type::string_view;
189 { exprtk::rtl::io::file::details::perform_check<T>(); }
193 auto ptr =
scalar_t(parameters[0])();
195 const auto& set = *make_set_handle<strgrps_cllctn::set_t>(ptr);
196 return process(set, parameters);
203 for (std::size_t i = 1; i < parameters.size(); ++i)
205 if (set.count(to_str(
string_t(parameters[i]))))
225 using scalar_t =
typename generic_type::scalar_view;
226 using string_t =
typename generic_type::string_view;
234 { exprtk::rtl::io::file::details::perform_check<T>(); }
238 auto ptr =
scalar_t(parameters[0])();
240 const auto& set = *make_set_handle<strgrps_cllctn::set_t>(ptr);
241 return T(set.size());
257 using scalar_t =
typename generic_type::scalar_view;
258 using string_t =
typename generic_type::string_view;
266 { exprtk::rtl::io::file::details::perform_check<T>(); }
270 const auto ptr =
scalar_t(parameters[0])();
271 const int index =
static_cast<int>(
scalar_t(parameters[1])());
275 auto& set = *make_set_handle<strgrps_cllctn::set_t>(ptr);
279 (
static_cast<std::size_t
>(index) >= set.size())
285 auto itr = set.begin();
286 std::advance(itr,index);
304 using scalar_t =
typename generic_type::scalar_view;
305 using string_t =
typename generic_type::string_view;
313 { exprtk::rtl::io::file::details::perform_check<T>(); }
317 auto ptr =
scalar_t(parameters[0])();
319 auto& set = *make_set_handle<strgrps_cllctn::set_t>(ptr);
320 return process(set,parameters);
327 std::size_t count = 0;
328 for (std::size_t i = 1; i < parameters.size(); ++i)
330 count += set.erase(to_str(
string_t(parameters[i])));
349 using strset_t = std::set<std::string>;
354 girl_names.insert(
"jane");
355 girl_names.insert(
"jill");
357 boy_names.insert(
"jack");
358 boy_names.insert(
"jim" );
359 boy_names.insert(
"john");
363 names_groups.
add_group(
"girls", girl_names);
364 names_groups.
add_group(
"boys", boy_names );
366 assert(names_groups.
contains(
"girls"));
367 assert(names_groups.
contains(
"boys" ));
369 groups_impl::create <T> group_create (names_groups);
370 groups_impl::add <T> group_add (names_groups);
372 groups_impl::size <T> group_size (names_groups);
373 groups_impl::get <T> group_get (names_groups);
374 groups_impl::erase <T> group_erase (names_groups);
378 symbol_table_t symbol_table;
379 expression_t expression;
382 symbol_table.add_function(
"create" , group_create );
383 symbol_table.add_function(
"add" , group_add );
384 symbol_table.add_function(
"contains", group_contains);
385 symbol_table.add_function(
"size" , group_size );
386 symbol_table.add_function(
"get" , group_get );
387 symbol_table.add_function(
"erase" , group_erase );
388 symbol_table.add_function(
"println" , println );
390 expression.register_symbol_table(symbol_table);
392 const std::string program =
393 " /* Load the groups from symbol table */ "
394 " var girls := create('girls'); "
395 " var boys := create('boys' ); "
399 " println('failed to create girls set!'); "
405 " println('failed to create boys set!'); "
409 " var name := 'john'; "
411 " if (contains(girls, name)) "
413 " println(name, ' in girls set'); "
417 " println(name, ' NOT in girls set'); "
420 " if (contains(boys, name)) "
422 " println(name, ' in boys set'); "
426 " println(name, ' NOT in boys set'); "
429 " /* Create a group from scratch */ "
430 " var pets := create('pets'); "
432 " add(pets, 'buddy'); "
433 " add(pets, 'fluffy', 'snowy'); "
434 " add(pets, 'ziggy', 'monty', 'teddy'); "
436 " if (contains(pets, name)) "
438 " println(name, ' in pets set'); "
442 " println(name, ' NOT in pets set'); "
445 " if (contains(pets, name, 'fluffy')) "
447 " println(name, ' or fluffy in pets set'); "
451 " println(name, ' or fluffy NOT in pets set'); "
454 " println('List of \\'pets\\':'); "
456 " for (var i := 0; i < size(pets); i += 1) "
458 " println('[', i ,']: ', get(pets,i)); "
461 " if (erase(pets, 'fluffy', 'teddy') != 2) "
463 " println('Failed to erase fluffy and teddy'); "
467 " println('List of \\'pets\\':'); "
469 " for (var i := 0; i < size(pets); i += 1) "
471 " println('[', i ,']: ', get(pets,i)); "
475 if (!parser.compile(program, expression))
477 printf(
"Error: %s\tExpression: %s\n",
478 parser.error().c_str(),
508 groups_example<double>();
igeneric_function(const std::string ¶m_seq="", const return_type rtr_type=e_rtrn_scalar)
T operator()(parameter_list_t parameters) override
typename exprtk::igeneric_function< T > igfun_t
typename generic_type::scalar_view scalar_t
T process(strgrps_cllctn::set_t &set, const parameter_list_t ¶meters)
add(groups_collection< std::string > &groups)
typename igfun_t::generic_type generic_type
typename generic_type::string_view string_t
typename igfun_t::parameter_list_t parameter_list_t
typename generic_type::string_view string_t
typename exprtk::igeneric_function< T > igfun_t
typename generic_type::scalar_view scalar_t
T process(const strgrps_cllctn::set_t &set, parameter_list_t ¶meters) const
typename igfun_t::parameter_list_t parameter_list_t
T operator()(parameter_list_t parameters) override
contains(groups_collection< std::string > &groups)
typename igfun_t::generic_type generic_type
T operator()(parameter_list_t parameters) override
typename igfun_t::generic_type generic_type
typename generic_type::string_view string_t
typename exprtk::igeneric_function< T > igfun_t
create(groups_collection< std::string > &groups)
typename igfun_t::parameter_list_t parameter_list_t
typename generic_type::scalar_view scalar_t
T operator()(parameter_list_t parameters) override
typename exprtk::igeneric_function< T > igfun_t
T process(strgrps_cllctn::set_t &set, parameter_list_t ¶meters)
typename igfun_t::parameter_list_t parameter_list_t
typename generic_type::string_view string_t
erase(groups_collection< std::string > &groups)
typename igfun_t::generic_type generic_type
typename exprtk::igeneric_function< T > igfun_t
T operator()(std::string &result, parameter_list_t parameters) override
typename generic_type::string_view string_t
typename igfun_t::generic_type generic_type
get(groups_collection< std::string > &groups)
typename generic_type::scalar_view scalar_t
typename igfun_t::parameter_list_t parameter_list_t
typename generic_type::string_view string_t
typename generic_type::scalar_view scalar_t
T operator()(parameter_list_t parameters) override
size(groups_collection< std::string > &groups)
typename igfun_t::parameter_list_t parameter_list_t
typename igfun_t::generic_type generic_type
typename exprtk::igeneric_function< T > igfun_t
SetType * make_set_handle(T v)
std::map< std::string, std::set< T > > groups
ptr_t get(const std::string group_name)
bool contains(const std::string &group_name) const
bool add_group(const std::string &group_name, const std::set< T > &set)