Skip to content

Commit

Permalink
馃帹 Improve the extension point mechanism
Browse files Browse the repository at this point in the history
- ... COVID is really hard to work with, even after it's over. Let's hope it doesn't randomly escalate, later....
  • Loading branch information
ThePhD committed Mar 1, 2021
1 parent eb4c26d commit 4797468
Show file tree
Hide file tree
Showing 6 changed files with 191 additions and 108 deletions.
63 changes: 50 additions & 13 deletions include/ztd/text/any_encoding.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -408,9 +408,18 @@ namespace ztd { namespace text {
_DecodeCodeUnits __input, decode_state& __state) const override {
__real_decode_state& __actual_state = this->_M_get_state(__state);
auto& __encoding = this->__base_t::get_value();
if constexpr (__txt_detail::__is_detected_v<__txt_detail::__detect_object_validate_code_units_one,
if constexpr (__txt_detail::__is_detected_v<__txt_detail::__detect_adl_text_validate_code_units_one,
_Encoding, _DecodeCodePoints, __real_decode_state>) {
auto __raw_result = __encoding.validate_code_units_one(::std::move(__input), __actual_state);
auto __raw_result
= text_validate_code_units_one(__encoding, ::std::move(__input), __actual_state);
return __validate_code_units_result(
::std::move(__raw_result.input), __raw_result.valid, __state);
}
else if constexpr (__txt_detail::__is_detected_v<
__txt_detail::__detect_adl_internal_text_validate_code_units_one, _Encoding,
_DecodeCodePoints, __real_decode_state>) {
auto __raw_result
= __text_validate_code_units_one(__encoding, ::std::move(__input), __actual_state);
return __validate_code_units_result(
::std::move(__raw_result.input), __raw_result.valid, __state);
}
Expand All @@ -427,9 +436,19 @@ namespace ztd { namespace text {
_EncodeCodePoints __input, encode_state& __state) const override {
__real_encode_state& __actual_state = this->_M_get_state(__state);
auto& __encoding = this->__base_t::get_value();
if constexpr (__txt_detail::__is_detected_v<__txt_detail::__detect_object_validate_code_points_one,
_Encoding, _EncodeCodePoints, __real_encode_state>) {
auto __raw_result = __encoding.validate_code_points_one(::std::move(__input), __actual_state);
if constexpr (__txt_detail::__is_detected_v<
__txt_detail::__detect_adl_text_validate_code_points_one, _Encoding,
_EncodeCodePoints, __real_encode_state>) {
auto __raw_result
= text_validate_code_points_one(__encoding, ::std::move(__input), __actual_state);
return __validate_code_points_result(
::std::move(__raw_result.input), __raw_result.valid, __state);
}
else if constexpr (__txt_detail::__is_detected_v<
__txt_detail::__detect_adl_internal_text_validate_code_points_one,
_Encoding, _EncodeCodePoints, __real_encode_state>) {
auto __raw_result
= __text_validate_code_points_one(__encoding, ::std::move(__input), __actual_state);
return __validate_code_points_result(
::std::move(__raw_result.input), __raw_result.valid, __state);
}
Expand All @@ -447,11 +466,20 @@ namespace ztd { namespace text {
__real_decode_state& __actual_state = this->_M_get_state(__state);
__txt_detail::__pass_through_handler __pass_handler;
auto& __encoding = this->__base_t::get_value();
if constexpr (__txt_detail::__is_detected_v<__txt_detail::__detect_object_count_code_units_one,
_Encoding, _DecodeCodeUnits, __txt_detail::__pass_through_handler,
__real_decode_state>) {
auto __raw_result
= __encoding.count_code_units_one(::std::move(__input), __pass_handler, __actual_state);
if constexpr (__txt_detail::__is_detected_v<
__txt_detail::__detect_adl_internal_text_count_code_units_one, _Encoding,
_DecodeCodeUnits, __txt_detail::__pass_through_handler, __real_decode_state>) {
auto __raw_result = text_count_code_units_one(
__encoding, ::std::move(__input), __pass_handler, __actual_state);
return __count_code_units_result(::std::move(__raw_result.input), __raw_result.count, __state,
__raw_result.error_code, __raw_result.handled_errors);
}
else if constexpr (__txt_detail::__is_detected_v<
__txt_detail::__detect_adl_internal_text_count_code_units_one, _Encoding,
_DecodeCodeUnits, __txt_detail::__pass_through_handler,
__real_decode_state>) {
auto __raw_result = __text_count_code_units_one(
__encoding, ::std::move(__input), __pass_handler, __actual_state);
return __count_code_units_result(::std::move(__raw_result.input), __raw_result.count, __state,
__raw_result.error_code, __raw_result.handled_errors);
}
Expand All @@ -468,11 +496,20 @@ namespace ztd { namespace text {
__real_encode_state& __actual_state = this->_M_get_state(__state);
__txt_detail::__pass_through_handler __pass_handler;
auto& __encoding = this->__base_t::get_value();
if constexpr (__txt_detail::__is_detected_v<__txt_detail::__detect_object_count_code_points_one,
if constexpr (__txt_detail::__is_detected_v<__txt_detail::__detect_adl_text_count_code_points_one,
_Encoding, _EncodeCodePoints, __txt_detail::__pass_through_handler,
__real_encode_state>) {
auto __raw_result
= __encoding.count_code_points_one(::std::move(__input), __pass_handler, __actual_state);
auto __raw_result = text_count_code_points_one(
__encoding, ::std::move(__input), __pass_handler, __actual_state);
return __count_code_points_result(::std::move(__raw_result.input), __raw_result.count, __state,
__raw_result.error_code, __raw_result.handled_errors);
}
else if constexpr (__txt_detail::__is_detected_v<
__txt_detail::__detect_adl_internal_text_count_code_points_one, _Encoding,
_EncodeCodePoints, __txt_detail::__pass_through_handler,
__real_encode_state>) {
auto __raw_result = __text_count_code_points_one(
__encoding, ::std::move(__input), __pass_handler, __actual_state);
return __count_code_points_result(::std::move(__raw_result.input), __raw_result.count, __state,
__raw_result.error_code, __raw_result.handled_errors);
}
Expand Down
33 changes: 23 additions & 10 deletions include/ztd/text/count_code_points.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,14 +91,30 @@ namespace ztd { namespace text {
_WorkingInput __working_input(
__txt_detail::__reconstruct(std::in_place_type<_WorkingInput>, ::std::forward<_Input>(__input)));

if constexpr (__txt_detail::__is_detected_v<__txt_detail::__detect_object_count_code_points_one, _Encoding,
_WorkingInput, _ErrorHandler, _State>) {

::std::size_t __code_unit_count = 0;
::std::size_t __code_unit_count = 0;

if constexpr (__txt_detail::__is_detected_v<__txt_detail::__detect_adl_text_count_code_points_one, _Encoding,
_WorkingInput, _ErrorHandler, _State>) {
for (;;) {
auto __result = text_count_code_points_one(
tag<_UEncoding> {}, ::std::move(__working_input), __encoding, __error_handler, __state);
if (__result.error_code != encoding_error::ok) {
return _Result(
::std::move(__result.input), __code_unit_count, __state, __result.error_code, false);
}
__code_unit_count += __result.count;
__working_input = ::std::move(__result.input);
if (__txt_detail::__adl::__adl_empty(__working_input)) {
break;
}
}
}
else if constexpr (__txt_detail::__is_detected_v<
__txt_detail::__detect_adl_internal_text_count_code_points_one, _Encoding,
_WorkingInput, _ErrorHandler, _State>) {
for (;;) {
auto __result
= __encoding.count_code_points_one(::std::move(__working_input), __error_handler, __state);
auto __result = __text_count_code_points_one(
tag<_UEncoding> {}, ::std::move(__working_input), __encoding, __error_handler, __state);
if (__result.error_code != encoding_error::ok) {
return _Result(
::std::move(__result.input), __code_unit_count, __state, __result.error_code, false);
Expand All @@ -109,13 +125,10 @@ namespace ztd { namespace text {
break;
}
}
return _Result(::std::move(__working_input), __code_unit_count, __state, encoding_error::ok, false);
}
else {
using _CodeUnit = code_unit_t<_UEncoding>;

::std::size_t __code_unit_count = 0;

_CodeUnit __code_unit_buf[max_code_units_v<_UEncoding>] {};

for (;;) {
Expand All @@ -131,8 +144,8 @@ namespace ztd { namespace text {
break;
}
}
return _Result(::std::move(__working_input), __code_unit_count, __state, encoding_error::ok, false);
}
return _Result(::std::move(__working_input), __code_unit_count, __state, encoding_error::ok, false);
}

//////
Expand Down
30 changes: 23 additions & 7 deletions include/ztd/text/count_code_units.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,13 +89,31 @@ namespace ztd { namespace text {
_WorkingInput __working_input(
__txt_detail::__reconstruct(::std::in_place_type<_WorkingInput>, ::std::forward<_Input>(__input)));

if constexpr (__txt_detail::__is_detected_v<__txt_detail::__detect_object_count_code_units_one, _Encoding,
_WorkingInput, _ErrorHandler, _State>) {

::std::size_t __code_point_count = 0;
::std::size_t __code_point_count = 0;

if constexpr (__txt_detail::__is_detected_v<__txt_detail::__detect_adl_text_count_code_units_one, _Encoding,
_WorkingInput, _ErrorHandler, _State>) {
for (;;) {
auto __result = __encoding.count_code_units_one(__working_input, __error_handler, __state);
auto __result = text_count_code_units_one(
tag<_UEncoding> {}, ::std::move(__working_input), __encoding, __error_handler, __state);
if (__result.error_code != encoding_error::ok) {
return _Result(
::std::move(__result.input), __code_point_count, __state, __result.error_code, false);
}
__code_point_count += __result.count;
__working_input = ::std::move(__result.input);
if (__txt_detail::__adl::__adl_empty(__working_input)) {
break;
}
}
return _Result(::std::move(__working_input), __code_point_count, __state, encoding_error::ok, false);
}
else if constexpr (__txt_detail::__is_detected_v<
__txt_detail::__detect_adl_internal_text_count_code_units_one, _Encoding,
_WorkingInput, _ErrorHandler, _State>) {
for (;;) {
auto __result = __text_count_code_units_one(
tag<_UEncoding> {}, ::std::move(__working_input), __encoding, __error_handler, __state);
if (__result.error_code != encoding_error::ok) {
return _Result(
::std::move(__result.input), __code_point_count, __state, __result.error_code, false);
Expand All @@ -111,8 +129,6 @@ namespace ztd { namespace text {
else {
using _CodePoint = code_point_t<_UEncoding>;

::std::size_t __code_point_count = 0;

_CodePoint __code_point_buf[max_code_points_v<_UEncoding>] {};

for (;;) {
Expand Down
102 changes: 34 additions & 68 deletions include/ztd/text/detail/encoding_range.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,14 @@ namespace ztd { namespace text {
::std::declval<_Encoding>(), ::std::declval<_State&>()));

template <typename _Encoding, typename _Input, typename _State>
using __detect_object_validate_code_units_one = decltype(::std::declval<_Encoding>().validate_code_units_one(
::std::declval<_Input>(), ::std::declval<_State&>()));
using __detect_adl_text_validate_code_units_one
= decltype(text_validate_code_units_one(tag<__remove_cvref_t<_Encoding>> {}, ::std::declval<_Encoding>(),
::std::declval<_Input>(), ::std::declval<_State&>()));

template <typename _Encoding, typename _Input, typename _State>
using __detect_adl_internal_text_validate_code_units_one
= decltype(__text_validate_code_units_one(tag<__remove_cvref_t<_Encoding>> {},
::std::declval<_Encoding>(), ::std::declval<_Input>(), ::std::declval<_State&>()));

// validation: code points
template <typename _Input, typename _Encoding, typename _State>
Expand All @@ -76,14 +82,25 @@ namespace ztd { namespace text {
::std::declval<_Encoding>(), ::std::declval<_State&>()));

template <typename _Encoding, typename _Input, typename _State>
using __detect_object_validate_code_points_one
= decltype(::std::declval<_Encoding>().validate_code_points_one(
::std::declval<_Input>(), ::std::declval<_State&>()));
using __detect_adl_internal_text_validate_code_points_one
= decltype(__text_validate_code_points_one(tag<__remove_cvref_t<_Encoding>> {},
::std::declval<_Encoding>(), ::std::declval<_Input>(), ::std::declval<_State&>()));

template <typename _Encoding, typename _Input, typename _State>
using __detect_adl_text_validate_code_points_one
= decltype(text_validate_code_points_one(tag<__remove_cvref_t<_Encoding>> {},
::std::declval<_Encoding>(), ::std::declval<_Input>(), ::std::declval<_State&>()));

// counting: decode
// counting: code units
template <typename _Encoding, typename _Input, typename _Handler, typename _State>
using __detect_object_count_code_units_one = decltype(::std::declval<_Encoding>().count_code_units_one(
::std::declval<_Input>(), ::std::declval<_Handler>(), ::std::declval<_State&>()));
using __detect_adl_internal_text_count_code_units_one
= decltype(__text_count_code_units_one(tag<__remove_cvref_t<_Encoding>> {}, ::std::declval<_Encoding>(),
::std::declval<_Input>(), ::std::declval<_Handler>(), ::std::declval<_State&>()));

template <typename _Encoding, typename _Input, typename _Handler, typename _State>
using __detect_adl_text_count_code_units_one
= decltype(text_count_code_units_one(tag<__remove_cvref_t<_Encoding>> {}, ::std::declval<_Encoding>(),
::std::declval<_Input>(), ::std::declval<_Handler>(), ::std::declval<_State&>()));

template <typename _Input, typename _Encoding, typename _Handler, typename _State>
using __detect_adl_text_count_code_units
Expand All @@ -95,10 +112,16 @@ namespace ztd { namespace text {
= decltype(__text_count_code_units(tag<__remove_cvref_t<_Encoding>> {}, ::std::declval<_Input>(),
::std::declval<_Encoding>(), ::std::declval<_Handler>(), ::std::declval<_State&>()));

// counting: encode
// counting: code points
template <typename _Encoding, typename _Input, typename _Handler, typename _State>
using __detect_adl_internal_text_count_code_points_one
= decltype(__text_count_code_points_one(tag<__remove_cvref_t<_Encoding>> {}, ::std::declval<_Encoding>(),
::std::declval<_Input>(), ::std::declval<_Handler>(), ::std::declval<_State&>()));

template <typename _Encoding, typename _Input, typename _Handler, typename _State>
using __detect_object_count_code_points_one = decltype(::std::declval<_Encoding>().count_code_points_one(
::std::declval<_Input>(), ::std::declval<_Handler>(), ::std::declval<_State&>()));
using __detect_adl_text_count_code_points_one
= decltype(text_count_code_points_one(tag<__remove_cvref_t<_Encoding>> {}, ::std::declval<_Encoding>(),
::std::declval<_Input>(), ::std::declval<_Handler>(), ::std::declval<_State&>()));

template <typename _Input, typename _Encoding, typename _Handler, typename _State>
using __detect_adl_text_count_code_points
Expand Down Expand Up @@ -187,63 +210,6 @@ namespace ztd { namespace text {
template <typename _Handler, typename _Encoding, typename _Result, typename _Progress>
using __detect_callable_handler = decltype(::std::declval<_Handler>()(
::std::declval<const _Encoding&>(), ::std::declval<_Result>(), ::std::declval<_Progress>()));

template <typename _Encoding, typename _CodeUnits, typename _CodePoints, typename _Handler, typename _State>
inline constexpr bool __is_decode_encoding_for_v
= __is_detected_v<__detect_object_decode_one, _Encoding, _CodeUnits, _CodePoints, _Handler, _State>;

template <typename _Encoding, typename _CodeUnits, typename _CodePoints, typename _Handler, typename _State>
inline constexpr bool __is_encode_encoding_for_v
= __is_detected_v<__detect_object_encode_one, _Encoding, _CodePoints, _CodeUnits, _Handler, _State>;

template <typename _Encoding, typename _CodeUnits, typename _CodePoints, typename _Handler, typename _State>
inline constexpr bool __is_encoding_for_v
= __is_decode_encoding_for_v<_Encoding, _CodeUnits, _CodePoints, _Handler, _State>&&
__is_encode_encoding_for_v<_Encoding, _CodePoints, _CodeUnits, _Handler, _State>;

template <typename _Encoding, typename _CodeUnits, typename _CodePoints, typename _Handler, typename _State>
inline constexpr bool __is_counting_decode_encoding_for_v
= __is_detected_v<__detect_object_count_code_units_one, _Encoding, _CodeUnits, _CodePoints, _Handler,
_State>;

template <typename _Encoding, typename _CodeUnits, typename _CodePoints, typename _Handler, typename _State>
inline constexpr bool __is_counting_encode_encoding_for_v
= __is_detected_v<__detect_object_count_code_points_one, _Encoding, _CodePoints, _CodeUnits, _Handler,
_State>;

template <typename _Encoding, typename _CodeUnits, typename _CodePoints, typename _Handler, typename _State>
inline constexpr bool __is_counting_encoding_for_v
= __is_counting_decode_encoding_for_v<_Encoding, _CodeUnits, _CodePoints, _Handler, _State>&&
__is_counting_encode_encoding_for_v<_Encoding, _CodeUnits, _CodePoints, _Handler, _State>;

template <typename _Encoding, typename _CodeUnits, typename _Handler, typename _State>
inline constexpr bool __is_validating_code_units_encoding_for_v
= __is_detected_v<__detect_object_validate_code_units_one, _Encoding, _CodeUnits, _State>;

template <typename _Encoding, typename _CodePoints, typename _Handler, typename _State>
inline constexpr bool __is_validating_code_points_encoding_for_v
= __is_detected_v<__detect_object_validate_code_points_one, _Encoding, _CodePoints, _State>;

template <typename _Encoding, typename _CodeUnits, typename _CodePoints, typename _Handler, typename _State>
inline constexpr bool __is_validating_encoding_for_v
= __is_validating_code_units_encoding_for_v<_Encoding, _CodeUnits, _State>&&
__is_validating_code_points_encoding_for_v<_Encoding, _CodePoints, _State>;

template <typename _Encoding, typename _CodeUnits, typename _CodePoints, typename _Handler, typename _State>
inline constexpr bool __is_decode_backwards_encoding_for_v
= __is_decode_encoding_for_v<_Encoding, _CodeUnits, _CodePoints, _Handler, _State>&& __is_detected_v<
__detect_object_decode_one_backwards, _Encoding, _CodeUnits, _CodePoints, _Handler, _State>;

template <typename _Encoding, typename _CodeUnits, typename _CodePoints, typename _Handler, typename _State>
inline constexpr bool __is_encode_backwards_encoding_for_v
= __is_encode_encoding_for_v<_Encoding, _CodeUnits, _CodePoints, _Handler, _State>&& __is_detected_v<
__detect_object_encode_one_backwards, _Encoding, _CodePoints, _CodeUnits, _Handler, _State>;

template <typename _Encoding, typename _CodeUnits, typename _CodePoints, typename _Handler, typename _State>
inline constexpr bool __is_backwards_encoding_for_v
= __is_encode_backwards_encoding_for_v<_Encoding, _CodeUnits, _CodePoints, _Handler, _State>&&
__is_decode_backwards_encoding_for_v<_Encoding, _CodeUnits, _CodePoints, _Handler, _State>;

} // namespace __txt_detail
ZTD_TEXT_INLINE_ABI_NAMESPACE_CLOSE_I_
}} // namespace ztd::text
Expand Down

0 comments on commit 4797468

Please sign in to comment.