Skip to content

Commit

Permalink
Modernize for C++20 and clean up code
Browse files Browse the repository at this point in the history
  • Loading branch information
eXpl0it3r committed Oct 28, 2020
1 parent 51ed037 commit 8e5e1df
Show file tree
Hide file tree
Showing 16 changed files with 131 additions and 136 deletions.
13 changes: 6 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,33 +4,32 @@

Unit tests are written with the [Catch2](https://github.com/catchorg/Catch2) test framework.

**Note:** PubBus requires C++17
**Note:** PubBus requires C++17, the examples and tests use some C++20 features

## Example

```c++
#include <PubBus/PubBus.hpp>
#include <iostream>

struct DummyMessage : public pub::Message
struct DummyMessage : pub::Message
{
int important_value = 0;
};

int main()
{
auto bus = pub::MessageBus{};
auto msg = DummyMessage{};
msg.important_value = 100;
const auto message = DummyMessage{ .important_value = 100 };

bus.subscribe<DummyMessage>(
[](DummyMessage msg)
[](const DummyMessage message)
{
std::cout << "Important value: " << msg.important_value << "\n";
std::cout << "Important value: " << message.important_value << "\n";
}
);

bus.publish(msg);
bus.publish(message);
}
```

Expand Down
4 changes: 2 additions & 2 deletions build/SFML.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@
<AdditionalIncludeDirectories>$(SolutionDir)..\extlibs\include;$(SolutionDir)..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<PreprocessorDefinitions>SFML_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<LanguageStandard>stdcpp17</LanguageStandard>
<LanguageStandard>stdcpplatest</LanguageStandard>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>..\extlibs\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
Expand Down Expand Up @@ -138,7 +138,7 @@
<AdditionalIncludeDirectories>$(SolutionDir)..\extlibs\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<PreprocessorDefinitions>SFML_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<LanguageStandard>stdcpp17</LanguageStandard>
<LanguageStandard>stdcpplatest</LanguageStandard>
</ClCompile>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
Expand Down
4 changes: 2 additions & 2 deletions build/Simple.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>$(SolutionDir)..\include</AdditionalIncludeDirectories>
<LanguageStandard>stdcpp17</LanguageStandard>
<LanguageStandard>stdcpplatest</LanguageStandard>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
Expand All @@ -125,7 +125,7 @@
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>$(SolutionDir)..\include</AdditionalIncludeDirectories>
<LanguageStandard>stdcpp17</LanguageStandard>
<LanguageStandard>stdcpplatest</LanguageStandard>
</ClCompile>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
Expand Down
4 changes: 2 additions & 2 deletions build/Test.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>$(SolutionDir)..\include</AdditionalIncludeDirectories>
<LanguageStandard>stdcpp17</LanguageStandard>
<LanguageStandard>stdcpplatest</LanguageStandard>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
Expand All @@ -129,7 +129,7 @@
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>$(SolutionDir)..\include</AdditionalIncludeDirectories>
<LanguageStandard>stdcpp17</LanguageStandard>
<LanguageStandard>stdcpplatest</LanguageStandard>
</ClCompile>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
Expand Down
57 changes: 10 additions & 47 deletions examples/SFML/Messages.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,48 +5,31 @@
#include <SFML/Window/Keyboard.hpp>
#include <SFML/Window/Mouse.hpp>

struct WindowMessage : public pub::Message
struct WindowMessage : pub::Message
{
enum Type
enum class Type
{
Closed,
LostFocus,
GainedFocus
};

WindowMessage(const Type type)
: type{ type }
{}

Type type;
};

struct SizeMessage : public pub::Message
struct SizeMessage : pub::Message
{
SizeMessage(const sf::Vector2u size)
: size{ size }
{}

sf::Vector2u size;
};

struct KeyMessage : public pub::Message
struct KeyMessage : pub::Message
{
enum Type
enum class Type
{
Pressed,
Released
};

KeyMessage(const Type type, const sf::Keyboard::Key code, const bool alt, const bool control, const bool shift, const bool system)
: type{ type }
, code{ code }
, alt{ alt }
, control{ control }
, shift{ shift }
, system{ system }
{}

Type type;
sf::Keyboard::Key code;
bool alt;
Expand All @@ -55,51 +38,31 @@ struct KeyMessage : public pub::Message
bool system;
};

struct TextMessage : public pub::Message
struct TextMessage : pub::Message
{
TextMessage(const sf::Uint32 unicode)
: unicode{ unicode }
{}

sf::Uint32 unicode;
};

struct MouseMoveMessage : public pub::Message
struct MouseMoveMessage : pub::Message
{
MouseMoveMessage(const sf::Vector2i position)
: position{ position }
{}

sf::Vector2i position;
};

struct MouseButtonMessage : public pub::Message
struct MouseButtonMessage : pub::Message
{
enum Type
enum class Type
{
Pressed,
Released
};

MouseButtonMessage(const Type type, const sf::Mouse::Button button, const sf::Vector2i position)
: type{ type }
, button{ button }
, position{ position }
{}

Type type;
sf::Mouse::Button button;
sf::Vector2i position;
};

struct MouseWheelScrollMessage : public pub::Message
struct MouseWheelScrollMessage : pub::Message
{
MouseWheelScrollMessage(const sf::Mouse::Wheel wheel, const float delta, const sf::Vector2i position)
: wheel{ wheel }
, delta{ delta }
, position{ position }
{}

sf::Mouse::Wheel wheel;
float delta;
sf::Vector2i position;
Expand Down
50 changes: 28 additions & 22 deletions examples/SFML/SFML.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class PositionText final : public sf::Drawable
}

private:
void draw(sf::RenderTarget& target, sf::RenderStates states) const override final
void draw(sf::RenderTarget& target, const sf::RenderStates states) const override final
{
target.draw(m_text, states);
}
Expand All @@ -55,18 +55,18 @@ class ButtonText final : public sf::Drawable

void onKeyEvent(const KeyMessage& message)
{
const auto type = message.type == KeyMessage::Pressed ? "Pressed"s : "Released"s;
const auto type = message.type == KeyMessage::Type::Pressed ? "Pressed"s : "Released"s;
m_text.setString(type + ": " + std::to_string(message.code));
}

void onMouseEvent(const MouseButtonMessage& message)
{
const auto type = message.type == MouseButtonMessage::Pressed ? "Pressed"s : "Released"s;
const auto type = message.type == MouseButtonMessage::Type::Pressed ? "Pressed"s : "Released"s;
m_text.setString(type + ": " + std::to_string(message.button));
}

private:
void draw(sf::RenderTarget& target, sf::RenderStates states) const override final
void draw(sf::RenderTarget& target, const sf::RenderStates states) const override final
{
target.draw(m_text, states);
}
Expand Down Expand Up @@ -98,7 +98,7 @@ int main()

bus.subscribe<WindowMessage>([&window](const WindowMessage& message)
{
if (message.type == WindowMessage::Closed)
if (message.type == WindowMessage::Type::Closed)
{
window.close();
}
Expand All @@ -115,42 +115,48 @@ int main()
switch (event.type)
{
case sf::Event::Closed:
bus.publish<WindowMessage>({ WindowMessage::Closed });
bus.publish(WindowMessage{ .type = WindowMessage::Type::Closed });
break;
case sf::Event::Resized:
bus.publish<SizeMessage>({ { event.size.width, event.size.height } });
bus.publish(SizeMessage{ .size = { event.size.width, event.size.height } });
break;
case sf::Event::LostFocus:
case sf::Event::GainedFocus:
bus.publish<WindowMessage>({ event.type == sf::Event::LostFocus ? WindowMessage::LostFocus : WindowMessage::GainedFocus });
bus.publish(WindowMessage{
.type = event.type == sf::Event::LostFocus ? WindowMessage::Type::LostFocus : WindowMessage::Type::GainedFocus
});
break;
case sf::Event::MouseMoved:
bus.publish<MouseMoveMessage>({ { event.mouseMove.x, event.mouseMove.y } });
bus.publish(MouseMoveMessage{ .position = { event.mouseMove.x, event.mouseMove.y } });
break;
case sf::Event::KeyPressed:
case sf::Event::KeyReleased:
bus.publish<KeyMessage>({
event.type == sf::Event::KeyPressed ? KeyMessage::Pressed : KeyMessage::Released,
event.key.code,
event.key.alt,
event.key.control,
event.key.shift,
event.key.system
bus.publish(KeyMessage{
.type = event.type == sf::Event::KeyPressed ? KeyMessage::Type::Pressed : KeyMessage::Type::Released,
.code = event.key.code,
.alt = event.key.alt,
.control = event.key.control,
.shift = event.key.shift,
.system = event.key.system
});
break;
case sf::Event::MouseButtonPressed:
case sf::Event::MouseButtonReleased:
bus.publish<MouseButtonMessage>({
event.type == sf::Event::MouseButtonPressed ? MouseButtonMessage::Pressed : MouseButtonMessage::Released,
event.mouseButton.button,
{ event.mouseButton.x, event.mouseButton.y }
bus.publish(MouseButtonMessage{
.type = event.type == sf::Event::MouseButtonPressed ? MouseButtonMessage::Type::Pressed : MouseButtonMessage::Type::Released,
.button = event.mouseButton.button,
.position = { event.mouseButton.x, event.mouseButton.y }
});
break;
case sf::Event::MouseWheelScrolled:
bus.publish<MouseWheelScrollMessage>({ event.mouseWheelScroll.wheel, event.mouseWheelScroll.delta, { event.mouseWheelScroll.x, event.mouseWheelScroll.y } });
bus.publish(MouseWheelScrollMessage{
.wheel = event.mouseWheelScroll.wheel,
.delta = event.mouseWheelScroll.delta,
.position = { event.mouseWheelScroll.x, event.mouseWheelScroll.y }
});
break;
case sf::Event::TextEntered:
bus.publish<TextMessage>({ event.text.unicode });
bus.publish(TextMessage{ .unicode = event.text.unicode });
break;
default:
break;
Expand Down
11 changes: 5 additions & 6 deletions examples/Simple/Simple.cpp
Original file line number Diff line number Diff line change
@@ -1,23 +1,22 @@
#include <PubBus/PubBus.hpp>
#include <iostream>

struct DummyMessage : public pub::Message
struct DummyMessage : pub::Message
{
int important_value = 0;
};

int main()
{
auto bus = pub::MessageBus{};
auto msg = DummyMessage{};
msg.important_value = 100;
const auto message = DummyMessage{ .important_value = 100 };

bus.subscribe<DummyMessage>(
[](DummyMessage msg)
[](const DummyMessage message)
{
std::cout << "Important value: " << msg.important_value << "\n";
std::cout << "Important value: " << message.important_value << "\n";
}
);

bus.publish(msg);
bus.publish(message);
}
5 changes: 1 addition & 4 deletions include/PubBus/Message.hpp
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
#pragma once

#include <typeinfo>
#include <typeindex>

namespace pub
{
class Message
struct Message
{
public:
using Id = std::type_index;

public:
template<typename T>
static Id id();
};
Expand Down
10 changes: 3 additions & 7 deletions include/PubBus/MessageBus.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ namespace pub
template<typename M>
void publish(M message);
template<typename M>
bool validate(SubscriberHandle handle) const;
[[nodiscard]] bool validate(SubscriberHandle handle) const;

private:
std::map<Message::Id, std::unique_ptr<MessageContainerBase>> m_repository;
Expand All @@ -29,7 +29,7 @@ namespace pub
SubscriberHandle MessageBus::subscribe(std::function<void(M)> subscriber)
{
auto repo = m_repository.find(Message::id<M>());
auto valid = false;
auto valid = true;
auto index = std::size_t{ 0u };

if (repo == m_repository.end())
Expand All @@ -38,10 +38,6 @@ namespace pub
valid = result.second;
repo = result.first;
}
else
{
valid = true;
}

if (valid)
{
Expand Down Expand Up @@ -75,7 +71,7 @@ namespace pub
template<typename M>
bool MessageBus::validate(SubscriberHandle handle) const
{
bool result = false;
auto result = false;

if (handle.id() != Message::id<M>())
{
Expand Down
Loading

0 comments on commit 8e5e1df

Please sign in to comment.