8000 Merge pull request #1 from ChaiScript/feature_enum_utility_helper · ChaiScript/ChaiScript@b6287a1 · GitHub
[go: up one dir, main page]

Skip to content

Commit b6287a1

Browse files
committed
Merge pull request #1 from ChaiScript/feature_enum_utility_helper
Feature enum utility helper
2 parents 316ba45 + 888d897 commit b6287a1

File tree

2 files changed

+42
-13
lines changed

2 files changed

+42
-13
lines changed

include/chaiscript/utility/utility.hpp

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "../chaiscript.hpp"
1616
#include "../dispatchkit/proxy_functions.hpp"
1717
#include "../dispatchkit/type_info.hpp"
18+
#include "../dispatchkit/operators.hpp"
1819

1920

2021
namespace chaiscript
@@ -63,19 +64,30 @@ namespace chaiscript
6364
t_module.add(fun.first, fun.second);
6465
}
6566
}
66-
67+
6768
template<typename Enum, typename ModuleType>
6869
typename std::enable_if<std::is_enum<Enum>::value, void>::type
6970
add_class(ModuleType &t_module,
7071
const std::string &t_class_name,
71-
const std::vector<chaiscript::Proxy_Function> &t_constructors,
72-
const std::vector<std::pair<chaiscript::Boxed_Value, std::string>> &t_constants)
72+
const std::vector<std::pair<typename std::underlying_type<Enum>::type, std::string>> &t_constants)
7373
{
7474
t_module.add(chaiscript::user_type<Enum>(), t_class_name);
75-
75+
76+
t_module.add(chaiscript::constructor<Enum ()>(), t_class_name);
77+
t_module.add(chaiscript::constructor<Enum (const Enum &)>(), t_class_name);
78+
79+
t_module.add([](){
80+
// add some comparison and assignment operators
81+
using namespace chaiscript::bootstrap::operators;
82+
return assign<Enum>(not_equal<Enum>(equal<Enum>()));
83+
}());
84+
85+
t_module.add(chaiscript::fun([](const Enum &e, const typename std::underlying_type<Enum>::type &i) { return e == i; }), "==");
86+
t_module.add(chaiscript::fun([](const typename std::underlying_type<Enum>::type &i, const Enum &e) { return i == e; }), "==");
87+
7688
for (const auto &constant : t_constants)
7789
{
78-
t_module.add_global_const(constant.first, constant.second);
90+
t_module.add_global_const(chaiscript::const_var(Enum(constant.first)), constant.second);
7991
}
8092
}
8193
}

unittests/compiled_tests.cpp

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// caught in other cpp files if chaiscript causes them
33

44
#include <chaiscript/utility/utility.hpp>
5+
#include <chaiscript/dispatchkit/bootstrap_stl.hpp>
56

67
#ifdef CHAISCRIPT_MSVC
78
#pragma warning(push)
@@ -517,14 +518,19 @@ TEST_CASE("Utility_Test utility class wrapper")
517518

518519
}
519520

521+
520522
enum Utility_Test_Numbers
521523
{
522-
ONE,
524+
ONE,
523525
TWO,
524526
THREE
525527
};
526528

527-
TEST_CASE("Utility_Test utility class wrapper")
529+
void do_something_with_enum_vector(const std::vector<Utility_Test_Numbers> &)
530+
{
531+
}
532+
533+
TEST_CASE("Utility_Test utility class wrapper for enum")
528534
{
529535

530536
chaiscript::ModulePtr m = chaiscript::ModulePtr(new chaiscript::Module());
@@ -533,12 +539,10 @@ TEST_CASE("Utility_Test utility class wrapper")
533539

534540
chaiscript::utility::add_class<Utility_Test_Numbers>(*m,
535541
"Utility_Test_Numbers",
536-
{
537-
},
538-
{ { const_var(ONE), "ONE" },
539-
{ const_var(TWO), "TWO" },
540-
{ const_var(THREE), "THREE" }
541-
542+
{ { ONE, "ONE" },
543+
{ TWO, "TWO" },
544+
{ THREE, "THREE" }
545+
542546
}
543547
);
544548

@@ -550,6 +554,19 @@ TEST_CASE("Utility_Test utility class wrapper")
550554
CHECK(chai.eval<Utility_Test_Numbers>("TWO ") == 1);
551555
CHECK(chai.eval<Utility_Test_Numbers>("THREE ") == 2);
552556

557+
CHECK(chai.eval<bool>("ONE == 0"));
558+
559+
chai.add(chaiscript::fun(&do_something_with_enum_vector), "do_something_with_enum_vector");
560+
chai.add(chaiscript::vector_conversion<std::vector<Utility_Test_Numbers>>());
561+
CHECK_NOTHROW(chai.eval("var a = [ONE, TWO, THREE]"));
562+
CHECK_NOTHROW(chai.eval("do_something_with_enum_vector([ONE])"));
563+
CHECK_NOTHROW(chai.eval("[ONE]"));
564+
565+
CHECK(chai.eval<bool>("ONE == ONE"));
566+
CHECK(chai.eval<bool>("ONE != TWO"));
567+
CHECK_NOTHROW(chai.eval("var o = ONE; o = TWO"));
568+
569+
553570
}
554571

555572

0 commit comments

Comments
 (0)
0