Commit b88d7229 authored by neverlord's avatar neverlord

added is_comparable to makefile

parent c7593f4f
...@@ -193,6 +193,7 @@ nobase_library_include_HEADERS = \ ...@@ -193,6 +193,7 @@ nobase_library_include_HEADERS = \
cppa/util/if_else.hpp \ cppa/util/if_else.hpp \
cppa/util/is_array_of.hpp \ cppa/util/is_array_of.hpp \
cppa/util/is_builtin.hpp \ cppa/util/is_builtin.hpp \
cppa/util/is_comparable.hpp \
cppa/util/is_forward_iterator.hpp \ cppa/util/is_forward_iterator.hpp \
cppa/util/is_iterable.hpp \ cppa/util/is_iterable.hpp \
cppa/util/is_legal_tuple_type.hpp \ cppa/util/is_legal_tuple_type.hpp \
......
...@@ -255,3 +255,4 @@ cppa/intrusive/singly_linked_list.hpp ...@@ -255,3 +255,4 @@ cppa/intrusive/singly_linked_list.hpp
cppa/intrusive/forward_iterator.hpp cppa/intrusive/forward_iterator.hpp
unit_testing/test__intrusive_containers.cpp unit_testing/test__intrusive_containers.cpp
examples/dancing_kirby.cpp examples/dancing_kirby.cpp
cppa/util/is_comparable.hpp
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "test.hpp" #include "test.hpp"
#include "cppa/cppa.hpp"
#include "cppa/tuple.hpp" #include "cppa/tuple.hpp"
#include "cppa/config.hpp" #include "cppa/config.hpp"
#include "cppa/anything.hpp" #include "cppa/anything.hpp"
...@@ -61,6 +62,8 @@ using std::cout; ...@@ -61,6 +62,8 @@ using std::cout;
using std::cerr; using std::cerr;
using std::endl; using std::endl;
using namespace cppa;
void print_node_id() void print_node_id()
{ {
auto pinfo = cppa::process_information::get(); auto pinfo = cppa::process_information::get();
...@@ -74,10 +77,13 @@ void print_node_id() ...@@ -74,10 +77,13 @@ void print_node_id()
<< endl; << endl;
} }
char* find_char_or_end(char* cstr, const char what) std::vector<std::string> split(std::string const& str, char delim)
{ {
for (char c = *cstr; (c != '\0' && c != what); c = *(++cstr)) { } std::vector<std::string> result;
return cstr; std::stringstream strs{str};
std::string tmp;
while (std::getline(strs, tmp, delim)) result.push_back(tmp);
return result;
} }
std::map<std::string, std::string> std::map<std::string, std::string>
...@@ -86,26 +92,18 @@ get_kv_pairs(int argc, char** argv, int begin = 1) ...@@ -86,26 +92,18 @@ get_kv_pairs(int argc, char** argv, int begin = 1)
std::map<std::string, std::string> result; std::map<std::string, std::string> result;
for (int i = begin; i < argc; ++i) for (int i = begin; i < argc; ++i)
{ {
char* pos = find_char_or_end(argv[i], '='); auto vec = split(argv[i], '=');
if (*pos == '=') if (vec.size() != 2)
{
char* pos2 = find_char_or_end(pos + 1, '=');
if (*pos2 == '\0')
{
std::pair<std::string, std::string> kvp;
kvp.first = std::string(argv[i], pos);
kvp.second = std::string(pos + 1, pos2);
if (result.insert(std::move(kvp)).second == false)
{ {
std::string err = "key \""; cerr << "\"" << argv[i] << "\" is not a key-value pair" << endl;
err += std::string(argv[i], pos);
err += "\" already defined";
throw std::runtime_error(err);
}
} }
else if (result.insert(std::make_pair(vec[0], vec[1])).second == false)
{
cerr << "key \"" << vec[0] << "\" is already defined" << endl;
exit(1);
} }
} }
return std::move(result); return result;
} }
template<typename Iterator, class Container, typename Key> template<typename Iterator, class Container, typename Key>
...@@ -114,40 +112,72 @@ inline bool found_key(Iterator& i, Container& cont, Key&& key) ...@@ -114,40 +112,72 @@ inline bool found_key(Iterator& i, Container& cont, Key&& key)
return (i = cont.find(std::forward<Key>(key))) != cont.end(); return (i = cont.find(std::forward<Key>(key))) != cont.end();
} }
struct match_helper
{
any_tuple tup;
template<class... Args>
void operator()(partial_function&& pf, Args&&... args)
{
partial_function tmp;
tmp.splice(std::move(pf), std::forward<Args>(args)...);
tmp(tup);
}
};
template<typename F, typename S>
match_helper match(std::pair<F, S> const& what)
{
return {make_tuple(what.first, what.second)};
}
void usage(char const* argv0)
{
cout << "usage: " << split(argv0, '/').back() << " "
<< "[run=remote_actor] "
<< "[scheduler=(thread_pool_scheduler|mock_scheduler)]"
<< endl;
}
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
auto args = get_kv_pairs(argc, argv); auto args = get_kv_pairs(argc, argv);
if (!args.empty()) for (auto& kvp : args)
{ {
decltype(args.find("")) i; match(kvp)
if (found_key(i, args, "run")) (
on("run", arg_match) >> [&](std::string const& what)
{ {
auto& what = i->second;
if (what == "remote_actor") if (what == "remote_actor")
{ {
test__remote_actor(argv[0], true, args); test__remote_actor(argv[0], true, args);
return 0; exit(0);
} }
} },
else if (found_key(i, args, "scheduler")) on("scheduler", arg_match) >> [](std::string const& sched)
{ {
auto& sched = i->second;
if (sched == "thread_pool_scheduler") if (sched == "thread_pool_scheduler")
{ {
cout << "using thread_pool_scheduler" << endl; cout << "using thread_pool_scheduler" << endl;
cppa::set_scheduler(new cppa::detail::thread_pool_scheduler); set_scheduler(new cppa::detail::thread_pool_scheduler);
} }
else if (sched == "mock_scheduler") else if (sched == "mock_scheduler")
{ {
cout << "using mock_scheduler" << endl; cout << "using mock_scheduler" << endl;
cppa::set_scheduler(new cppa::detail::mock_scheduler); set_scheduler(new cppa::detail::mock_scheduler);
} }
else else
{ {
cerr << "unknown scheduler: " << sched << endl; cerr << "unknown scheduler: " << sched << endl;
return 1; exit(1);
} }
},
on_arg_match >> [&](std::string const& key, std::string const&)
{
cerr << "unknown key: \"" << key << "\"" << endl;
usage(argv[0]);
exit(2);
} }
);
} }
//print_node_id(); //print_node_id();
std::cout << std::boolalpha; std::cout << std::boolalpha;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment