28 namespace astrotypes {
31 template<
typename Derived>
35 std::stringstream ss(msg);
43 return std::runtime_error(ss.str());
46 template<
typename Derived>
51 template<
typename Derived>
57 template<
typename Derived>
60 static_cast<Derived&
>(*this).do_reset();
63 template<
typename Derived>
66 for(
auto const& header : _headers) {
67 header.second->reset();
71 template<
typename Derived>
74 auto it = _compare_headers.find(label);
75 if(it == _compare_headers.end())
return;
76 _compare_headers.erase(it);
79 template<
typename Derived>
82 auto it = _compare_headers.find(label);
83 if(it != _compare_headers.end())
return;
84 _compare_headers.insert(std::make_pair(label, _headers.at(label)));
87 template<
typename Derived>
90 for(
auto const& header : dst._headers) {
91 if(header.second->is_set()) {
92 auto& field = *_headers.at(header.first);
93 field = *header.second;
96 return static_cast<Derived&
>(*this);
99 template<
typename Derived>
102 static_cast<Derived&
>(*this).do_read(stream);
105 template<
typename Derived>
117 if (str !=
"HEADER_START"){
118 throw parse_error(
"expecting HEADER_START got ", str);
125 if( str.string().find(std::string(
"HEADER_END") ) != std::string::npos) {
130 auto it = _read_only_headers.find(str);
131 if( it == _read_only_headers.end()) {
133 it = _headers.find(str);
134 if( it == _headers.end()) {
135 throw parse_error(
"Header - unknown parameter", str);
140 _size += it->second->read(stream);
144 template<
typename Derived>
146 static_cast<Derived const&
>(*this).do_write(stream);
149 template<
typename Derived>
155 _size = start.
size();
158 for(
auto const& header : _headers) {
159 if(header.second->is_set())
161 stream << header.first;
162 _size += header.first.size();
163 _size += header.second->write(stream);
172 template<
typename Derived>
173 std::ostream& operator<<(std::ostream& stream, HeaderBase<Derived>
const& h)
179 template<
typename Derived>
182 headers.
read(stream);
186 template<
typename Derived>
189 return static_cast<Derived const&
>(*this).do_equal(h);
192 template<
typename Derived>
195 for(
auto const& header : _compare_headers) {
196 auto const& field = *h._headers.at(header.first);
197 if(header.second->is_set()) {
198 if(!field.is_set()) {
203 if(!(field == *header.second)) {
208 catch(std::exception
const& e) {
209 throw parse_error(std::string(
"exception comparing values for header ") + header.first.string(), e.what());
212 throw parse_error(
"exception comparing values for header ", header.first);
215 else if(field.is_set()) {
223 template<
typename Derived>
229 template<
typename Derived>
244 template<
typename Derived>
247 _headers.insert(std::make_pair(name, &field));
250 _compare_headers.insert(std::make_pair(name, &field));
254 template<
typename Derived>
257 _read_only_headers.insert(std::make_pair(name, &field));
260 template<
typename Derived>
265 template<
typename Derived>
266 template<
typename Stream>
272 template<
typename Derived>
273 template<
typename Stream>
279 template<
typename Derived>
280 template<
typename Stream>
283 for(
auto const& header : h._headers) {
284 if(header.second->is_set()) {
285 _os << std::left << std::setw(15) << header.second->header_info(header.first.string()) <<
" : ";
286 header.second->write_info(_os);
293 template<
typename Derived,
typename Stream>
296 return adapter.sentry(stream);
std::istream & operator>>(std::istream &stream, HeaderBase< Derived > &headers)
void read(std::istream &is)
HeaderBase< Derived >::template InfoSentry< Stream > const & operator<<(Stream &stream, typename HeaderBase< Derived >::Info const &adapter)