Кресты / Говнокод #27307 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
namespace detail {
    template<entity_event_t Event>
    struct EventHasEntityStateConstructor {
        // Sanity check
        static_assert(static_cast<int32_t>(Event) >= 0
                      && static_cast<int32_t>(Event) < ENTITY_EVENTS_COUNT);

    private:
        struct TwoChar {
            char a, b;
        };

        template<typename T>
        constexpr static TwoChar _check(
            decltype(
                T(std::declval<const entityState_t &>())
            )*
        );

        template<typename T>
        constexpr static char _check(...);

    public:
        constexpr inline static bool value = (sizeof(_check<EntityEvent<Event>>(nullptr)) == sizeof(TwoChar));
    };

    template<typename BusT, entity_event_t Event>
    bool defaultEntityEventPublisher(const BusT & bus, const entityState_t & eventEntity)
    {
        static_assert(EventHasEntityStateConstructor<Event>::value,
                      "defaultEntityEventFactory<Event>() instantiated for a custom\n"
                      "event that does not have a (const entityState_t & eventEntity) constructor.\n"
                      "This should not happen (you'll get a more obscured compiler error anyway)!");
        return bus.publishEmplace<EntityEvent<Event>>(eventEntity);
    }

    template<typename BusT, typename T, T... Is>
    constexpr std::array<EntityEventPublisherPtr<BusT>, sizeof...(Is)>
        createDefaultEntityEventFactories(std::integer_sequence<T, Is...>)
    {
        return {
            [](auto i) -> EntityEventPublisherPtr<BusT> {
                if constexpr (EventHasEntityStateConstructor<static_cast<entity_event_t>(i.value)>::value) {
                    return &defaultEntityEventPublisher<BusT, static_cast<entity_event_t>(i.value)>;
                } else {
                    return nullptr;
                }
            }(std::integral_constant<T, Is>{})...
        };
    }
}

// An (event_number -> EntityState<event_number> 'publishing factory' function) mapping;
// if event N could not be constructed from a single entityState_t reference
// then this table would contain nullptr at the index N
template<typename BusT>
const std::array<EntityEventPublisherPtr<BusT>, ENTITY_EVENTS_COUNT> & getDefaultEntityEventsPublishers() noexcept
{
    static auto factories = detail::createDefaultEntityEventFactories<BusT>(std::make_integer_sequence<int32_t, ENTITY_EVENTS_COUNT>());
    return factories;
}

template<typename BusT>
EntityEventPublisherPtr<BusT> tryGetDefaultEntityEventPublisher(entity_event_t event) noexcept
{
    auto eventNum = static_cast<int32_t>(event);
    if (eventNum >= 0 && eventNum < ENTITY_EVENTS_COUNT) {
        return getDefaultEntityEventsPublishers<BusT>()[eventNum];
    } else {
        return nullptr;
    }
}

Запостил: PolinaAksenova PolinaAksenova, (Updated )

Комментарии (10) RSS

Добавить комментарий

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8