7 #ifndef CPPWAMP_SOCKETOPTIONS_HPP
8 #define CPPWAMP_SOCKETOPTIONS_HPP
23 template <
typename TProtocol>
24 class SocketOptionBase
27 using Protocol = TProtocol;
28 using Ptr = std::shared_ptr<SocketOptionBase>;
30 virtual ~SocketOptionBase() {}
32 virtual int level(
const Protocol& p)
const = 0;
34 virtual int name(
const Protocol& p)
const = 0;
36 virtual const void* data(
const Protocol& p)
const = 0;
38 virtual size_t size(
const Protocol& p)
const = 0;
44 template <
typename TProtocol,
typename TOption>
45 class SocketOptionWrapper :
public SocketOptionBase<TProtocol>
48 using Protocol = TProtocol;
49 using Option = TOption;
51 SocketOptionWrapper(TOption&& option) : option_(std::move(option)) {}
53 virtual int level(
const Protocol& p)
const override
54 {
return option_.level(p);}
56 virtual int name(
const Protocol& p)
const override
57 {
return option_.name(p);}
59 virtual const void* data(
const Protocol& p)
const override
60 {
return option_.data(p);}
62 virtual size_t size(
const Protocol& p)
const override
63 {
return option_.size(p);}
74 template <
typename TProtocol>
78 using Protocol = TProtocol;
80 template <
typename TOption>
81 SocketOption(TOption&& option)
83 using DecayedOption =
typename std::decay<TOption>::type;
84 using ConcreteOption = SocketOptionWrapper<TProtocol, DecayedOption>;
85 option_.reset(
new ConcreteOption(std::move(option)));
88 int level(
const Protocol& p)
const {
return option_->level(p);}
90 int name(
const Protocol& p)
const {
return option_->name(p);}
92 const void* data(
const Protocol& p)
const {
return option_->data(p);}
94 size_t size(
const Protocol& p)
const {
return option_->size(p);}
97 typename SocketOptionBase<TProtocol>::Ptr option_;
103 template <
typename TProtocol>
104 class SocketOptionList
107 using Protocol = TProtocol;
108 using Option = SocketOption<Protocol>;
110 template <
typename TOption>
111 void add(TOption&& option)
113 options_.emplace_back(std::forward<TOption>(option));
116 template <
typename TSocket>
117 void applyTo(TSocket& socket)
const
119 for (
const auto& opt: options_)
120 socket.set_option(opt);
124 std::vector<Option> options_;
131 #endif // CPPWAMP_SOCKETOPTIONS_HPP