Skip to content

Commit

Permalink
Fixed older gcc build problems and added proper type_class tests
Browse files Browse the repository at this point in the history
  • Loading branch information
iboB committed Mar 17, 2020
1 parent 9f566bf commit f2f48e8
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 82 deletions.
1 change: 0 additions & 1 deletion CMakeLists.txt
Expand Up @@ -81,7 +81,6 @@ src_group(public dynamix_sources
${inc_path}/define_message.hpp
${inc_path}/define_message_split.hpp
${inc_path}/define_mixin.hpp
${inc_path}/define_type_class.hpp
${inc_path}/dm_this.hpp
${inc_path}/dynamix.hpp
${inc_path}/exception.hpp
Expand Down
38 changes: 0 additions & 38 deletions include/dynamix/define_type_class.hpp

This file was deleted.

2 changes: 1 addition & 1 deletion include/dynamix/domain.hpp
Expand Up @@ -106,7 +106,7 @@ class DYNAMIX_API domain
domain();
~domain();

friend class object_type_info;
friend class dynamix::object_type_info;
friend class object_mutator;

// non-copyable
Expand Down
6 changes: 2 additions & 4 deletions include/dynamix/type_class.hpp
Expand Up @@ -20,7 +20,6 @@ namespace dynamix

static constexpr type_class_id INVALID_TYPE_CLASS_ID = ~type_class_id(0);

class define_type_class;
class object_type_info;

namespace internal
Expand All @@ -33,7 +32,8 @@ class domain;
class DYNAMIX_API type_class
{
public:
type_class(define_type_class builder);
typedef bool (*match_func)(const object_type_info&);
type_class(match_func func, bool register_globally = false);
~type_class();

// do not copy or move
Expand All @@ -42,8 +42,6 @@ class DYNAMIX_API type_class
type_class(type_class&&) = delete;
type_class& operator=(type_class&&) = delete;

typedef bool (*match_func)(const object_type_info&);

type_class_id id() const { return _id; }
bool is_registered() const { return _id != INVALID_TYPE_CLASS_ID; }

Expand Down
16 changes: 11 additions & 5 deletions src/type_class.cpp
Expand Up @@ -6,21 +6,27 @@
// https://opensource.org/licenses/MIT
//
#include "internal.hpp"
#include "dynamix/define_type_class.hpp"
#include "dynamix/type_class.hpp"
#include "dynamix/domain.hpp"

namespace dynamix
{

type_class::type_class(define_type_class builder)
: _match_func(builder.func)
type_class::type_class(type_class::match_func func, bool register_globally /*= false*/)
: _match_func(func)
{
if (builder.do_register)
if (register_globally)
{
internal::domain::safe_instance().register_type_class(*this);
}
}

type_class::~type_class() = default;
type_class::~type_class()
{
if (is_registered())
{
internal::domain::safe_instance().unregister_type_class(*this);
}
}

}
74 changes: 41 additions & 33 deletions test/type_classes.cpp
Expand Up @@ -6,7 +6,7 @@
// https://opensource.org/licenses/MIT
//
#include <dynamix/core.hpp>
#include <dynamix/define_type_class.hpp>
#include <dynamix/type_class.hpp>

#include "doctest/doctest.h"

Expand All @@ -33,49 +33,57 @@ TEST_CASE("local")
object gs; mutate(gs).add<ghost>().add<soldier>();
object vt; mutate(vt).add<visible>().add<tank>();

type_class has_ghost = define_type_class([](const dynamix::object_type_info& ti) {
type_class has_ghost([](const object_type_info& ti) {
return ti.has<ghost>();
});

//type_class move_and_shoot = define_type_class()
// .implements(move_msg)
// .implements(shoot_msg);
type_class move_and_shoot([](const object_type_info& ti) {
return ti.implements(move_msg) && ti.implements(shoot_msg);
});

//type_class shoot_and_visible_and_tank = define_type_class()
// .implements(move_msg)
// .has<tank>();
type_class shoot_and_visible_and_tank([](const object_type_info& ti) {
return ti.implements(shoot_msg) && ti.implements(draw_msg) && ti.has<tank>();
});

CHECK(gc.is_a(has_ghost));

//CHECK_FALSE(vc.is_a(has_ghost));
//CHECK_FALSE(vc.is_a(move_and_shoot));
//CHECK_FALSE(vc.is_a(shoot_and_visible_and_tank));
CHECK_FALSE(vc.is_a(has_ghost));
CHECK_FALSE(vc.is_a(move_and_shoot));
CHECK_FALSE(vc.is_a(shoot_and_visible_and_tank));

//CHECK(gs.is_a(has_ghost));
//CHECK(gs.is_a(move_and_shoot));
CHECK(gs.is_a(has_ghost));
CHECK(gs.is_a(move_and_shoot));

//CHECK_FALSE(vt.is_a(has_ghost));
//CHECK(vt.is_a(move_and_shoot));
//CHECK(vt.is_a(shoot_and_visible_and_tank));
CHECK_FALSE(vt.is_a(has_ghost));
CHECK(vt.is_a(move_and_shoot));
CHECK(vt.is_a(shoot_and_visible_and_tank));
}

//const dynamix::type_class move_and_shoot_and_ghost = dynamix::register_type_class()
// .implements(move_msg)
// .implements(shoot_msg)
// .has<ghost>();
//
//const dynamix::type_class move_and_ghost_and_tank = dynamix::register_type_class()
// .implements(move_msg)
// .has<ghost>()
// .has<tank>();

//TEST_CASE("global")
//{
// using namespace dynamix;
// object gt; mutate(gt).add<ghost>().add<tank>();
//
// CHECK(gt._type_info->_matching_type_classes.size() == 2);
//}
const dynamix::type_class move_and_shoot_and_ghost([](const dynamix::object_type_info& ti) {
return ti.implements(move_msg)
&& ti.implements(shoot_msg)
&& ti.has<ghost>();
}, true);

const dynamix::type_class move_and_ghost_and_tank([](const dynamix::object_type_info& ti) {
return ti.implements(move_msg)
&& ti.has<ghost>()
&& ti.has<tank>();
}, true);

TEST_CASE("global")
{
using namespace dynamix;
object gt; mutate(gt).add<ghost>().add<tank>();
CHECK(gt._type_info->_matching_type_classes.size() == 2);
CHECK(gt.is_a(move_and_shoot_and_ghost));
CHECK(gt.is_a(move_and_ghost_and_tank));

object gs; mutate(gs).add<ghost>().add<soldier>();
CHECK(gs._type_info->_matching_type_classes.size() == 1);
CHECK(gs.is_a(move_and_shoot_and_ghost));
CHECK_FALSE(gs.is_a(move_and_ghost_and_tank));
}

DYNAMIX_DEFINE_MESSAGE(move);
DYNAMIX_DEFINE_MESSAGE(draw);
Expand Down

0 comments on commit f2f48e8

Please sign in to comment.