add Dealer interfaces
This commit is contained in:
parent
6cda20c93c
commit
728a4c3365
@ -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
65
iface/common/dealer.hh
Normal 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
|
16
iface/common/dealer_test.cc
Normal file
16
iface/common/dealer_test.cc
Normal 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});
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user