#include #include class TestBaseType { public: TestBaseType() : val(10), const_val(15) { } TestBaseType(int) : val(10), const_val(15) {} TestBaseType(int *) : val(10), const_val(15) {} virtual ~TestBaseType() {} virtual int func() { return 0; } int base_only_func() { return -9; } const TestBaseType &constMe() const { return *this; } int val; const int const_val; private: TestBaseType &operator=(const TestBaseType &); }; enum TestEnum { TestValue1 = 1 }; int to_int(TestEnum t) { return t; } class TestDerivedType : public TestBaseType { public: virtual ~TestDerivedType() {} virtual int func() { return 1; } int derived_only_func() { return 19; } private: TestDerivedType &operator=(const TestDerivedType &); }; class TestMoreDerivedType : public TestDerivedType { public: virtual ~TestMoreDerivedType() {} }; std::shared_ptr derived_type_factory() { return std::shared_ptr(new TestDerivedType()); } std::shared_ptr more_derived_type_factory() { return std::shared_ptr(new TestMoreDerivedType()); } std::string hello_world() { return "Hello World"; } int *get_new_int() { return new int(1); } // MSVC doesn't like that we are using C++ return types from our C declared module // but this is the best way to do it for cross platform compatibility #ifdef CHAISCRIPT_MSVC #pragma warning(push) #pragma warning(disable : 4190) #endif #ifdef __llvm__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wreturn-type-c-linkage" #endif CHAISCRIPT_MODULE_EXPORT chaiscript::ModulePtr create_chaiscript_module_test_module() { chaiscript::ModulePtr m(new chaiscript::Module()); m->add(chaiscript::fun(hello_world), "hello_world"); m->add(chaiscript::user_type(), "TestBaseType"); m->add(chaiscript::user_type(), "TestDerivedType"); m->add(chaiscript::user_type(), "TestMoreDerivedType"); m->add(chaiscript::constructor(), "TestBaseType"); // m->add(chaiscript::constructor(), "TestBaseType"); m->add(chaiscript::constructor(), "TestBaseType"); m->add(chaiscript::constructor(), "TestBaseType"); m->add(chaiscript::constructor(), "TestDerivedType"); m->add(chaiscript::constructor(), "TestDerivedType"); m->add(chaiscript::constructor(), "TestMoreDerivedType"); m->add(chaiscript::constructor(), "TestMoreDerivedType"); /// \todo automatic chaining of base classes? m->add(chaiscript::base_class()); m->add(chaiscript::base_class()); m->add(chaiscript::base_class()); m->add(chaiscript::fun(&TestDerivedType::derived_only_func), "derived_only_func"); m->add(chaiscript::fun(&derived_type_factory), "derived_type_factory"); m->add(chaiscript::fun(&more_derived_type_factory), "more_derived_type_factory"); m->add(chaiscript::fun(&TestDerivedType::func), "func"); m->add(chaiscript::fun(&TestBaseType::func), "func"); m->add(chaiscript::fun(&TestBaseType::val), "val"); m->add(chaiscript::fun(&TestBaseType::const_val), "const_val"); m->add(chaiscript::fun(&TestBaseType::base_only_func), "base_only_func"); m->add(chaiscript::fun(&get_new_int), "get_new_int"); m->add_global_const(chaiscript::const_var(TestValue1), "TestValue1"); m->add(chaiscript::user_type(), "TestEnum"); m->add(chaiscript::fun(&to_int), "to_int"); m->add(chaiscript::fun(&TestBaseType::constMe), "constMe"); return m; } #ifdef __llvm__ #pragma clang diagnostic pop #endif #ifdef CHAISCRIPT_MSVC #pragma warning(pop) #endif