SocketStreams v1.11.1
Loading...
Searching...
No Matches
ContainerWrapper.h
Go to the documentation of this file.
1#pragma once
2
3#include <concepts>
4#include <functional>
5
6namespace web
7{
8 namespace utility
9 {
13 template<typename T>
14 concept Container = requires(T value)
15 {
16 { value.data() } -> std::same_as<char*>;
17 { static_cast<const T&>(value).data() } -> std::same_as<const char*>;
18 { static_cast<const T&>(value).size() } -> std::same_as<size_t>;
19 { value.resize(size_t()) };
20 { value[size_t()] } -> std::same_as<char&>;
21 };
22
27 {
28 protected:
29 std::function<char* ()> dataImplementation;
30 std::function<const char* ()> constDataImplementation;
31 std::function<size_t()> sizeImplementation;
32 std::function<void(size_t)> resizeImplementation;
33 std::function<char& (size_t)> operatorImplementation;
34
35 protected:
37 (
38 const std::function<char* ()>& dataImplementation,
39 const std::function<const char* ()>& constDataImplementation,
40 const std::function<size_t()>& sizeImplementation,
41 const std::function<void(size_t)>& resizeImplementation,
42 const std::function<char& (size_t)>& operatorImplementation
43 );
44
45 public:
46 template<Container T>
47 ContainerWrapper(T& value);
48
50
51 ContainerWrapper(ContainerWrapper&&) noexcept = default;
52
53 ContainerWrapper& operator = (const ContainerWrapper&) = delete;
54
55 ContainerWrapper& operator = (ContainerWrapper&&) noexcept = default;
56
57 char* data();
58
59 const char* data() const;
60
61 size_t size() const;
62
63 void resize(size_t newSize);
64
65 char& operator [](size_t index);
66
67 virtual ~ContainerWrapper() = default;
68 };
69 }
70}
71
72namespace web
73{
74 namespace utility
75 {
76 template<Container T>
77 ContainerWrapper::ContainerWrapper(T& value) :
79 (
80 [&value]() mutable -> char*
81 {
82 return value.data();
83 },
84 [&value]() mutable -> const char*
85 {
86 return const_cast<const T&>(value).data();
87 },
88 [&value]() mutable -> size_t
89 {
90 return value.size();
91 },
92 [&value](size_t newSize) mutable -> void
93 {
94 value.resize(newSize);
95 },
96 [&value](size_t index) mutable -> char&
97 {
98 return value[index];
99 }
100 )
101 {
102
103 }
104 }
105}
Wrap Container concept instance.
Definition ContainerWrapper.h:27
ContainerWrapper(const std::function< char *()> &dataImplementation, const std::function< const char *()> &constDataImplementation, const std::function< size_t()> &sizeImplementation, const std::function< void(size_t)> &resizeImplementation, const std::function< char &(size_t)> &operatorImplementation)
Definition ContainerWrapper.cpp:8
std::function< void(size_t)> resizeImplementation
Definition ContainerWrapper.h:32
char * data()
Definition ContainerWrapper.cpp:24
std::function< size_t()> sizeImplementation
Definition ContainerWrapper.h:31
std::function< const char *()> constDataImplementation
Definition ContainerWrapper.h:30
std::function< char &(size_t)> operatorImplementation
Definition ContainerWrapper.h:33
ContainerWrapper(const ContainerWrapper &)=delete
ContainerWrapper(ContainerWrapper &&) noexcept=default
std::function< char *()> dataImplementation
Definition ContainerWrapper.h:29
size_t size() const
Definition ContainerWrapper.cpp:34
void resize(size_t newSize)
Definition ContainerWrapper.cpp:39
Requirements for in/out socket operations.
Definition ContainerWrapper.h:14
Definition ContainerWrapper.cpp:4