Skip to content

Commit 26c4851

Browse files
committed
Add static fields and message containers
1 parent 66bdccf commit 26c4851

22 files changed

Lines changed: 1891 additions & 517 deletions

include/boost/http_proto.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@
3838
#include <boost/http_proto/serializer.hpp>
3939
#include <boost/http_proto/sink.hpp>
4040
#include <boost/http_proto/source.hpp>
41+
#include <boost/http_proto/static_fields.hpp>
42+
#include <boost/http_proto/static_request.hpp>
43+
#include <boost/http_proto/static_response.hpp>
4144
#include <boost/http_proto/status.hpp>
4245
#include <boost/http_proto/string_body.hpp>
4346
#include <boost/http_proto/version.hpp>

include/boost/http_proto/fields_base.hpp

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class fields_base
3737
: public virtual fields_view_base
3838
{
3939
detail::header h_;
40+
bool static_storage = false;
4041

4142
class op_t;
4243
using entry =
@@ -45,35 +46,65 @@ class fields_base
4546
detail::header::table;
4647

4748
friend class fields;
49+
template<std::size_t>
50+
friend class static_fields;
51+
friend class request_base;
4852
friend class request;
53+
template<std::size_t>
54+
friend class static_request;
55+
friend class response_base;
4956
friend class response;
57+
template<std::size_t>
58+
friend class static_response;
5059
friend class serializer;
5160
friend class message_base;
5261
friend struct detail::header;
5362
friend struct detail::prefix_op;
5463

64+
BOOST_HTTP_PROTO_DECL
65+
explicit
66+
fields_base(
67+
detail::kind) noexcept;
68+
5569
BOOST_HTTP_PROTO_DECL
5670
fields_base(
5771
detail::kind,
58-
std::size_t size);
72+
char*,
73+
std::size_t) noexcept;
5974

6075
BOOST_HTTP_PROTO_DECL
6176
fields_base(
6277
detail::kind,
63-
std::size_t size,
64-
std::size_t max_size);
78+
std::size_t);
6579

6680
BOOST_HTTP_PROTO_DECL
67-
explicit
6881
fields_base(
69-
detail::kind) noexcept;
82+
detail::kind,
83+
std::size_t,
84+
std::size_t);
7085

7186
BOOST_HTTP_PROTO_DECL
7287
fields_base(
7388
detail::kind,
7489
core::string_view);
7590

76-
fields_base(detail::header const&);
91+
BOOST_HTTP_PROTO_DECL
92+
fields_base(
93+
detail::kind,
94+
char*,
95+
std::size_t,
96+
core::string_view);
97+
98+
BOOST_HTTP_PROTO_DECL
99+
explicit
100+
fields_base(
101+
detail::header const&);
102+
103+
BOOST_HTTP_PROTO_DECL
104+
fields_base(
105+
detail::header const&,
106+
char*,
107+
std::size_t);
77108

78109
public:
79110
/** Destructor

include/boost/http_proto/fields_view.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ class BOOST_SYMBOL_VISIBLE
2424
: public fields_view_base
2525
{
2626
friend class fields;
27+
template<std::size_t>
28+
friend class static_fields;
2729

2830
#ifndef BOOST_HTTP_PROTO_DOCS
2931
protected:

include/boost/http_proto/fields_view_base.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,21 @@ class fields_view_base
3232
detail::header const* ph_;
3333

3434
friend class fields;
35+
template<std::size_t>
36+
friend class static_fields;
3537
friend class fields_base;
3638
friend class fields_view;
3739
friend class message_base;
3840
friend class message_view_base;
41+
friend class request_base;
3942
friend class request;
43+
template<std::size_t>
44+
friend class static_request;
4045
friend class request_view;
46+
friend class response_base;
4147
friend class response;
48+
template<std::size_t>
49+
friend class static_response;
4250
friend class response_view;
4351
friend class serializer;
4452

include/boost/http_proto/message_base.hpp

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ class message_base
2525
: public fields_base
2626
, public message_view_base
2727
{
28-
friend class request;
29-
friend class response;
28+
friend class request_base;
29+
friend class response_base;
3030

3131
explicit
3232
message_base(
@@ -37,6 +37,16 @@ class message_base
3737
{
3838
}
3939

40+
message_base(
41+
detail::kind k,
42+
char* storage,
43+
std::size_t storage_size) noexcept
44+
: fields_view_base(&this->fields_base::h_)
45+
, fields_base(
46+
k, storage, storage_size)
47+
{
48+
}
49+
4050
message_base(
4151
detail::kind k,
4252
std::size_t storage_size)
@@ -67,15 +77,37 @@ class message_base
6777
{
6878
}
6979

80+
message_base(
81+
detail::kind k,
82+
char* storage,
83+
std::size_t storage_size,
84+
core::string_view s)
85+
: fields_view_base(
86+
&this->fields_base::h_)
87+
, fields_base(
88+
k, storage, storage_size, s)
89+
{
90+
}
91+
7092
explicit
7193
message_base(
72-
detail::header const& ph) noexcept
94+
detail::header const& ph)
7395
: fields_view_base(
7496
&this->fields_base::h_)
7597
, fields_base(ph)
7698
{
7799
}
78100

101+
message_base(
102+
detail::header const& ph,
103+
char* storage,
104+
std::size_t storage_size)
105+
: fields_view_base(
106+
&this->fields_base::h_)
107+
, fields_base(ph, storage, storage_size)
108+
{
109+
}
110+
79111
public:
80112
//--------------------------------------------
81113
//

0 commit comments

Comments
 (0)