add Dealer interfaces

This commit is contained in:
falsycat 2023-07-15 22:49:25 +09:00
parent 6cda20c93c
commit 728a4c3365
3 changed files with 83 additions and 0 deletions

View File

@ -9,6 +9,7 @@ target_sources(nf7_iface
PRIVATE
version.cc
PUBLIC
common/dealer.hh
common/container.hh
common/future.hh
common/observer.hh
@ -18,6 +19,7 @@ target_sources(nf7_iface
add_executable(nf7_iface_test)
target_sources(nf7_iface_test
PRIVATE
common/dealer_test.cc
common/container_test.cc
common/future_test.cc
common/observer_test.hh

65
iface/common/dealer.hh Normal file
View File

@ -0,0 +1,65 @@
// No copyright
#pragma once
#include <string>
#include <utility>
#include "iface/common/observer.hh"
namespace nf7 {
struct DealerMeta {
public:
std::string name;
std::string description;
};
template <typename T>
class Dealer {
public:
explicit Dealer(const DealerMeta& meta) noexcept : meta_(meta) { }
virtual ~Dealer() = default;
Dealer(const Dealer&) = default;
Dealer(Dealer&&) = default;
Dealer& operator=(const Dealer&) = default;
Dealer& operator=(Dealer&&) = default;
const DealerMeta& meta() const noexcept { return meta_; }
private:
const DealerMeta& meta_;
};
template <typename T>
class Maker : public Dealer<T>, public Observer<T>::Target {
public:
explicit Maker(const DealerMeta& meta) noexcept : Dealer<T>(meta) { }
protected:
void Emit(T&& v) noexcept { Observer<T>::Target::Notify(std::move(v)); }
};
template <typename T>
class Emitter : public Maker<T> {
public:
explicit Emitter(const DealerMeta& meta) noexcept : Maker<T>(meta) { }
using Maker<T>::Emit;
};
template <typename T>
class Taker : public Dealer<T>, public Observer<T>::Target {
public:
explicit Taker(const DealerMeta& meta) noexcept : Dealer<T>(meta) { }
void Take(const T& v) noexcept {
Notify(v);
onTake();
}
protected:
virtual void onTake() noexcept = 0;
};
} // namespace nf7

View File

@ -0,0 +1,16 @@
// No copyright
#include "iface/common/dealer.hh"
#include <gtest/gtest.h>
#include "iface/common/observer_test.hh"
TEST(Emitter, Emit) {
nf7::Emitter<int32_t> sut {{"hello", "this is a maker"}};
nf7::test::ObserverMock<int32_t> obs {sut};
EXPECT_CALL(obs, NotifyWithMove(int32_t {777})).Times(1);
sut.Emit(int32_t {777});
}