16#ifndef _PCRE2CPP_MATCH_RESULT_HPP_
17 #define _PCRE2CPP_MATCH_RESULT_HPP_
21 #if !_PCRE2CPP_HAS_CXX17
31 #pragma region MATCH_VALUE
38 template<utf_type utf>
39 struct basic_match_value {
41 using _string_type =
typename utils::pcre2_data<utf>::string_type;
50 #if _PCRE2CPP_HAS_UTF8
53 #if _PCRE2CPP_HAS_UTF16
56 #if _PCRE2CPP_HAS_UTF32
60 #if _PCRE2CPP_HAS_UTF8
62 #elif _PCRE2CPP_HAS_UTF16
64 #elif _PCRE2CPP_HAS_UTF32
69 #pragma region SUB_MATCH_VALUE
89 template<utf_type utf>
96 using _pcre2_data_t = utils::pcre2_data<utf>;
97 using _string_type =
typename _pcre2_data_t::string_type;
98 using _string_view_type =
typename _pcre2_data_t::string_view_type;
99 using _match_value = basic_match_value<utf>;
100 #if _PCRE2CPP_HAS_EXCEPTIONS
101 using _match_result_exception = basic_match_result_exception<utf>;
103 using _named_sub_values_table = std::unordered_map<_string_type, size_t>;
104 using _named_sub_values_table_ptr = std::shared_ptr<_named_sub_values_table>;
107 struct _value_result_data {
109 _match_value result = {
bad_offset, _string_type() };
110 std::vector<std::optional<sub_match_value> > sub_results = {};
111 _named_sub_values_table_ptr named_sub_values = {};
116 std::variant<match_error_codes, _value_result_data> _data = _value_result_data();
120 #if _PCRE2CPP_HAS_UTF8
124 #if _PCRE2CPP_HAS_UTF16
126 return u
"Subexpression index out of bounds or has no value";
130 #if _PCRE2CPP_HAS_UTF32
132 return U
"Subexpression index out of bounds or has no value";
137 return _string_type();
142 static _PCRE2CPP_CONSTEXPR17 _string_type _get_subexpression_not_found(
const _string_view_type name)
noexcept {
143 #if _PCRE2CPP_HAS_UTF8
145 return fmt::format(
"Subexpression with provided name '{}' not found", name);
149 #if _PCRE2CPP_HAS_UTF16
151 return fmt::format(u
"Subexpression with provided name '{}' not found", name);
155 #if _PCRE2CPP_HAS_UTF32
157 return fmt::format(U
"Subexpression with provided name '{}' not found", name);
162 return _string_type();
168 const auto& named_sub_values = std::get<_value_result_data>(_data).named_sub_values;
169 #if _PCRE2CPP_HAS_CXX20
170 return named_sub_values->contains(name.data());
172 return named_sub_values->find(name.data()) != named_sub_values->end();
178 const auto& subResults = std::get<_value_result_data>(_data).sub_results;
179 return idx < subResults.size() && subResults[idx].has_value();
184 if (!_has_named_sub_result(name)) {
185 #if _PCRE2CPP_HAS_EXCEPTIONS
186 throw _match_result_exception(_get_subexpression_not_found(name));
192 return std::get<_value_result_data>(_data).named_sub_values->at(name.data());
197 if (!_has_sub_value(idx)) {
198 #if _PCRE2CPP_HAS_EXCEPTIONS
199 throw basic_match_result_exception<utf>(_get_out_of_bounds_string());
202 return { .relative_offset =
bad_offset, .size = 0 };
206 return std::get<_value_result_data>(_data).sub_results[idx].value();
210 #pragma region CONSTRUCTORS
219 const _named_sub_values_table_ptr& named_sub_values) noexcept
220 : _data(_value_result_data { .search_offset = search_offset, .named_sub_values = named_sub_values }) {}
224 const std::vector<std::optional<sub_match_value> >& sub_results,
225 const _named_sub_values_table_ptr& named_sub_values) noexcept
226 : _data(_value_result_data { .search_offset = search_offset,
228 .sub_results = sub_results,
229 .named_sub_values = named_sub_values,
246 #pragma region ERRORS
253 if (!
has_error()) {
return match_error_codes::None; }
254 return std::get<match_error_codes>(_data);
259 if (!
has_error()) {
return _string_type(); }
260 return pcre2cpp::generate_error_message<utf>(
static_cast<int>(std::get<match_error_codes>(_data)));
263 #if _PCRE2CPP_HAS_EXCEPTIONS
267 throw _match_result_exception(
static_cast<int>(std::get<match_error_codes>(_data)));
271 #pragma endregion ERRORS
273 #pragma region RESULTS
281 return std::get<_value_result_data>(_data).found;
287 return _has_sub_value(idx);
292 return _has_named_sub_result(name) &&
has_sub_value(_get_named_sub_result_idx(name));
298 return std::get<_value_result_data>(_data).search_offset;
301 #pragma region RESULT
306 return std::get<_value_result_data>(_data).result;
312 const auto& value = std::get<_value_result_data>(_data);
313 return value.search_offset + value.result.relative_offset;
319 return std::get<_value_result_data>(_data).result.relative_offset;
325 return std::get<_value_result_data>(_data).result.value.size();
330 if (!
has_value()) {
return _string_type(); }
331 return std::get<_value_result_data>(_data).result.value;
334 #pragma endregion RESULT
336 #pragma region ALL_SUB_RESULTS
341 return std::get<_value_result_data>(_data).sub_results;
351 const auto& value = std::get<_value_result_data>(_data);
353 std::vector<size_t> offsets;
354 offsets.reserve(value.sub_results.size());
355 for (
const auto& subResult : value.sub_results) {
356 if (subResult.has_value()) {
357 offsets.push_back(value.search_offset + value.result.relative_offset + subResult->relative_offset);
368 const auto& value = std::get<_value_result_data>(_data);
370 std::vector<size_t> offsets;
371 offsets.reserve(value.sub_results.size());
372 for (
const auto& subResult : value.sub_results) {
373 if (subResult.has_value()) {
374 offsets.push_back(value.result.relative_offset + subResult->relative_offset);
385 const auto& sub_results = std::get<_value_result_data>(_data).sub_results;
387 std::vector<size_t> offsets;
388 offsets.reserve(sub_results.size());
389 for (
const auto& subResult : sub_results) {
390 if (subResult.has_value()) { offsets.push_back(subResult->relative_offset); }
400 const auto& sub_results = std::get<_value_result_data>(_data).sub_results;
402 std::vector<size_t> values;
403 values.reserve(sub_results.size());
404 for (
const auto& subResult : sub_results) {
405 if (subResult.has_value()) { values.emplace_back(subResult->size); }
406 else { values.push_back(0); }
415 const auto& data = std::get<_value_result_data>(_data);
416 const auto& value = data.result.value;
417 const auto& sub_results = data.sub_results;
419 std::vector<_string_type> values;
420 values.reserve(sub_results.size());
421 for (
const auto& subResult : sub_results) {
422 if (subResult.has_value()) {
423 values.emplace_back(value.data() + subResult->relative_offset, subResult->size);
425 else { values.push_back(_string_type()); }
430 #pragma endregion ALL_SUB_RESULTS
432 #pragma region SUB_RESULTS_BY_IDX
436 return _get_sub_value(idx);
443 const auto [relative_offset, size] = _get_sub_value(idx);
444 const auto& value = std::get<_value_result_data>(_data);
445 return value.search_offset + value.result.relative_offset + relative_offset;
452 const auto [relative_offset, size] = _get_sub_value(idx);
453 const auto& value = std::get<_value_result_data>(_data);
454 return value.result.relative_offset + relative_offset;
460 return _get_sub_value(idx).relative_offset;
466 return _get_sub_value(idx).size;
473 const auto [relative_offset, size] = _get_sub_value(idx);
474 const auto& value = std::get<_value_result_data>(_data).result.value;
475 return _string_type(value.data() + relative_offset, size);
480 #pragma region SUB_RESULTS_BY_NAME
514 #pragma endregion RESULTS
517 #if _PCRE2CPP_HAS_UTF8
520 #if _PCRE2CPP_HAS_UTF16
523 #if _PCRE2CPP_HAS_UTF32
527 #if _PCRE2CPP_HAS_UTF8
529 #elif _PCRE2CPP_HAS_UTF16
531 #elif _PCRE2CPP_HAS_UTF32
Basic container to result data of match function.
Definition pcre2cpp.hpp:1090
_PCRE2CPP_CONSTEXPR17 bool has_result() const noexcept
returns true when result holds some result not error
Definition pcre2cpp.hpp:1276
_PCRE2CPP_CONSTEXPR17 match_error_codes get_error_code() const noexcept
return error code
Definition pcre2cpp.hpp:1252
_PCRE2CPP_CONSTEXPR17 size_t get_search_offset() const noexcept
returns search offset
Definition pcre2cpp.hpp:1296
_PCRE2CPP_CONSTEXPR17 size_t get_sub_results_count() const noexcept
returns sub results count
Definition pcre2cpp.hpp:1345
_PCRE2CPP_CONSTEXPR17 basic_match_result() noexcept=default
default constructor
_PCRE2CPP_CONSTEXPR17 size_t get_sub_result_global_offset(const size_t idx) const _PCRE2CPP_NOEXCEPT
returns sub result offset from the beginning of searched string
Definition pcre2cpp.hpp:1440
_PCRE2CPP_CONSTEXPR17 size_t get_sub_result_size(const size_t idx) const _PCRE2CPP_NOEXCEPT
returns sub result value size
Definition pcre2cpp.hpp:1464
_PCRE2CPP_CONSTEXPR17 std::vector< _string_type > get_sub_results_values() const noexcept
returns sub results string values
Definition pcre2cpp.hpp:1412
_PCRE2CPP_CONSTEXPR20 std::vector< size_t > get_sub_results_sizes() const noexcept
returns sub results value sizes
Definition pcre2cpp.hpp:1397
_PCRE2CPP_CONSTEXPR17 sub_match_value get_sub_result(const size_t idx) const _PCRE2CPP_NOEXCEPT
returns sub result container
Definition pcre2cpp.hpp:1435
static _PCRE2CPP_CONSTEXPR17 size_t bad_offset
error offset (returned when value doesn't exist or when error has occurred)
Definition pcre2cpp.hpp:1093
_PCRE2CPP_CONSTEXPR17 _string_type get_error_message() const noexcept
returns error message
Definition pcre2cpp.hpp:1258
_PCRE2CPP_CONSTEXPR17 _match_value get_result() const noexcept
returns match result container
Definition pcre2cpp.hpp:1304
_PCRE2CPP_CONSTEXPR17 size_t get_result_global_offset() const noexcept
returns offset of value from the beginning of searched string
Definition pcre2cpp.hpp:1310
_PCRE2CPP_CONSTEXPR17 size_t get_sub_result_in_result_offset(const size_t idx) const _PCRE2CPP_NOEXCEPT
returns sub result offset relative to result offset
Definition pcre2cpp.hpp:1458
_PCRE2CPP_CONSTEXPR20 std::vector< size_t > get_sub_results_in_result_offsets() const noexcept
returns sub results offsets relative to result offset
Definition pcre2cpp.hpp:1382
_PCRE2CPP_CONSTEXPR20 std::vector< std::optional< sub_match_value > > get_sub_results() const noexcept
returns all sub results
Definition pcre2cpp.hpp:1339
_PCRE2CPP_CONSTEXPR17 bool has_error() const noexcept
returns true if result holds error
Definition pcre2cpp.hpp:1249
_PCRE2CPP_CONSTEXPR17 _string_type get_result_value() const noexcept
returns match string value
Definition pcre2cpp.hpp:1329
_PCRE2CPP_CONSTEXPR20 std::vector< size_t > get_sub_results_global_offsets() const noexcept
returns sub results offsets from the beginning of search string
Definition pcre2cpp.hpp:1348
_PCRE2CPP_CONSTEXPR17 size_t get_sub_result_relative_offset(const size_t idx) const _PCRE2CPP_NOEXCEPT
returns sub result offset relative to search offset
Definition pcre2cpp.hpp:1449
_PCRE2CPP_CONSTEXPR17 size_t get_result_size() const noexcept
returns size of match value
Definition pcre2cpp.hpp:1323
_PCRE2CPP_CONSTEXPR20 std::vector< size_t > get_sub_results_relative_offsets() const noexcept
returns sub results offsets relative to search offset
Definition pcre2cpp.hpp:1365
_PCRE2CPP_CONSTEXPR17 size_t get_result_relative_offset() const noexcept
return offset relative to search offset
Definition pcre2cpp.hpp:1317
_PCRE2CPP_CONSTEXPR20 ~basic_match_result() noexcept=default
default destructor
_PCRE2CPP_CONSTEXPR17 bool has_value() const noexcept
returns true when result has value
Definition pcre2cpp.hpp:1279
_PCRE2CPP_CONSTEXPR17 bool has_sub_value(const size_t idx) const noexcept
returns true when result has sub value on given index
Definition pcre2cpp.hpp:1285
_PCRE2CPP_CONSTEXPR17 _string_type get_sub_result_value(const size_t idx) const _PCRE2CPP_NOEXCEPT
returns sub result string value
Definition pcre2cpp.hpp:1470
#define _PCRE2CPP_NOEXCEPT
Definition config.hpp:178
@ UTF_16
Definition pcre2cpp.hpp:357
@ UTF_32
Definition pcre2cpp.hpp:360
@ UTF_8
Definition pcre2cpp.hpp:354
#define _PCRE2CPP_CONSTEXPR17
constexpr for c++17 and higher
Definition config.hpp:239
#define _PCRE2CPP_CONSTEXPR20
constexpr keyword for c++20 and higher
Definition config.hpp:257
#define _PCRE2CPP_ERROR(MESSAGE)
compiler error
Definition config.hpp:278
#define pcre2cpp_assert(expression,...)
pcre2cpp assert
Definition pcre2cpp.hpp:1957
Main namespace of pcre2cpp library.
basic_match_result< utf_type::UTF_8 > u8match_result
Definition pcre2cpp.hpp:1518
basic_match_result< utf_type::UTF_32 > u32match_result
Definition pcre2cpp.hpp:1524
basic_match_result< utf_type::UTF_16 > u16match_result
Definition pcre2cpp.hpp:1521
u8match_result match_result
Definition pcre2cpp.hpp:1528
u8match_value match_value
Definition pcre2cpp.hpp:1061
basic_match_value< utf_type::UTF_16 > u16match_value
Definition pcre2cpp.hpp:1054
basic_match_value< utf_type::UTF_32 > u32match_value
Definition pcre2cpp.hpp:1057
basic_match_value< utf_type::UTF_8 > u8match_value
Definition pcre2cpp.hpp:1051
Match value container.
Definition pcre2cpp.hpp:1039
_string_type value
match value
Definition pcre2cpp.hpp:1047
size_t relative_offset
offset relative to search offset
Definition pcre2cpp.hpp:1045
Sub match value container.
Definition pcre2cpp.hpp:1075
size_t size
size of value
Definition pcre2cpp.hpp:1079
size_t relative_offset
offset relative to search offset
Definition pcre2cpp.hpp:1077