Skip to content

Commit

Permalink
馃敤 Adjust single generation and move reconstruct!
Browse files Browse the repository at this point in the history
  • Loading branch information
ThePhD committed Jul 2, 2021
1 parent 7610526 commit 1da2d1d
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 88 deletions.
4 changes: 2 additions & 2 deletions include/ztd/text/detail/transcode_one.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ namespace ztd { namespace text {
__reconstruct(::std::in_place_type<_UOutput>, ::std::forward<_Output>(__output)), __state,
__intermediate_result.error_code, __intermediate_result.handled_errors);
}
else if (false) {
else if constexpr (__always_false_v<_Input>) {
// TODO: this branch SHOULD check for conditions conducive to unbounded_view...
}
else {
Expand Down Expand Up @@ -167,7 +167,7 @@ namespace ztd { namespace text {
__reconstruct(::std::in_place_type<_UOutput>, ::std::forward<_Output>(__output)), __state,
__intermediate_result.error_code, __intermediate_result.handled_errors);
}
else if (false) {
else if constexpr (__always_false_v<_Input>) {
// TODO: this branch SHOULD check for conditions conducive to unbounded_view...
}
else {
Expand Down
162 changes: 83 additions & 79 deletions include/ztd/text/reconstruct.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,113 +43,117 @@

#include <ztd/text/detail/prologue.hpp>

namespace ztd { namespace text {
ZTD_TEXT_INLINE_ABI_NAMESPACE_OPEN_I_

namespace __txt_detail {
template <typename _Input>
constexpr bool __span_or_reconstruct_noexcept() {
using _UInput = __remove_cvref_t<_Input>;
if constexpr (::std::is_array_v<_UInput> && ::std::is_lvalue_reference_v<_Input>) {
return true;
}
else if constexpr (__is_iterator_contiguous_iterator_v<__range_iterator_t<_Input>>) {
return true;
}
else {
return noexcept(__reconstruct(::std::in_place_type<_UInput>, ::std::declval<_Input>()));
}
}

template <typename _Input>
constexpr bool __string_view_or_span_or_reconstruct_noexcept() {
using _VInput = ::std::remove_reference_t<_Input>;
using _UInput = __remove_cvref_t<_Input>;
if constexpr (
::std::is_array_v<
_UInput> && ::std::is_const_v<::std::remove_extent_t<_VInput>> && ::std::is_lvalue_reference_v<_Input>) {
return true;
}
else {
return noexcept(__reconstruct(::std::in_place_type<_UInput>, ::std::declval<_Input>()));
}
}

template <typename _Input>
constexpr auto __span_or_reconstruct(_Input&& __input) noexcept(__span_or_reconstruct_noexcept<_Input>()) {
using _VInput = ::std::remove_reference_t<_Input>;
using _UInput = __remove_cvref_t<_Input>;
if constexpr (
__is_iterator_contiguous_iterator_v<__range_iterator_t<
_Input>> && !__is_specialization_of_v<_UInput, ::std::basic_string_view> && !__is_std_span_v<_UInput>) {
using _Ty = ::std::remove_extent_t<_VInput>;
return __reconstruct(::std::in_place_type<::ztd::text::span<_Ty>>, __adl::__adl_begin(__input),
__adl::__adl_end(__input));
}
else {
return __reconstruct(::std::in_place_type<_UInput>, ::std::forward<_Input>(__input));
namespace ztd {
namespace text {
ZTD_TEXT_INLINE_ABI_NAMESPACE_OPEN_I_

namespace __txt_detail {
template <typename _Input>
constexpr bool __span_or_reconstruct_noexcept() {
using _UInput = __remove_cvref_t<_Input>;
if constexpr (::std::is_array_v<_UInput> && ::std::is_lvalue_reference_v<_Input>) {
return true;
}
else if constexpr (__is_iterator_contiguous_iterator_v<__range_iterator_t<_Input>>) {
return true;
}
else {
return noexcept(__reconstruct(::std::in_place_type<_UInput>, ::std::declval<_Input>()));
}
}
}

template <typename _Input>
constexpr auto __string_view_or_span_or_reconstruct(_Input&& __input) noexcept(
__string_view_or_span_or_reconstruct_noexcept<_Input>()) {
using _VInput = ::std::remove_reference_t<_Input>;
using _UInput = __remove_cvref_t<_Input>;
if constexpr (
::std::is_array_v<
_UInput> && ::std::is_const_v<::std::remove_extent_t<_VInput>> && ::std::is_lvalue_reference_v<_Input>) {
using _CharTy = ::std::remove_extent_t<_UInput>;
if constexpr (__is_char_traitable_v<_CharTy>) {
return ::std::basic_string_view<_CharTy>(::std::forward<_Input>(__input));

template <typename _Input>
constexpr bool __string_view_or_span_or_reconstruct_noexcept() {
using _VInput = ::std::remove_reference_t<_Input>;
using _UInput = __remove_cvref_t<_Input>;
if constexpr (
::std::is_array_v<
_UInput> && ::std::is_const_v<::std::remove_extent_t<_VInput>> && ::std::is_lvalue_reference_v<_Input>) {
return true;
}
else {
return noexcept(__reconstruct(::std::in_place_type<_UInput>, ::std::declval<_Input>()));
}
}

template <typename _Input>
constexpr auto __span_or_reconstruct(_Input&& __input) noexcept(
__span_or_reconstruct_noexcept<_Input>()) {
using _VInput = ::std::remove_reference_t<_Input>;
using _UInput = __remove_cvref_t<_Input>;
if constexpr (
__is_iterator_contiguous_iterator_v<__range_iterator_t<
_Input>> && !__is_specialization_of_v<_UInput, ::std::basic_string_view> && !__is_std_span_v<_UInput>) {
using _Ty = ::std::remove_extent_t<_VInput>;
return __reconstruct(::std::in_place_type<::ztd::text::span<_Ty>>, __adl::__adl_begin(__input),
__adl::__adl_end(__input));
__adl::__adl_end(__input));
}
else {
return __reconstruct(::std::in_place_type<_UInput>, ::std::forward<_Input>(__input));
}
}
else {

template <typename _Input>
constexpr auto __string_view_or_span_or_reconstruct(_Input&& __input) noexcept(
__string_view_or_span_or_reconstruct_noexcept<_Input>()) {
using _VInput = ::std::remove_reference_t<_Input>;
using _UInput = __remove_cvref_t<_Input>;
if constexpr (
__is_iterator_contiguous_iterator_v<__range_iterator_t<
_Input>> && !__is_specialization_of_v<_UInput, ::std::basic_string_view> && !__is_std_span_v<_UInput>) {
using _CharTy = __range_value_type_t<_Input>;
::std::is_array_v<
_UInput> && ::std::is_const_v<::std::remove_extent_t<_VInput>> && ::std::is_lvalue_reference_v<_Input>) {
using _CharTy = ::std::remove_extent_t<_UInput>;
if constexpr (__is_char_traitable_v<_CharTy>) {
return __reconstruct(::std::in_place_type<::std::basic_string_view<_CharTy>>,
__adl::__adl_begin(__input), __adl::__adl_end(__input));
return ::std::basic_string_view<_CharTy>(::std::forward<_Input>(__input));
}
else {
using _Ty = ::std::remove_extent_t<_VInput>;
return __reconstruct(::std::in_place_type<::ztd::text::span<_Ty>>,
__adl::__adl_begin(__input), __adl::__adl_end(__input));
__adl::__adl_begin(__input), __adl::__adl_end(__input));
}
}
else {
return __reconstruct(::std::in_place_type<_UInput>, ::std::forward<_Input>(__input));
if constexpr (
__is_iterator_contiguous_iterator_v<__range_iterator_t<
_Input>> && !__is_specialization_of_v<_UInput, ::std::basic_string_view> && !__is_std_span_v<_UInput>) {
using _CharTy = __range_value_type_t<_Input>;
if constexpr (__is_char_traitable_v<_CharTy>) {
return __reconstruct(::std::in_place_type<::std::basic_string_view<_CharTy>>,
__adl::__adl_begin(__input), __adl::__adl_end(__input));
}
else {
using _Ty = ::std::remove_extent_t<_VInput>;
return __reconstruct(::std::in_place_type<::ztd::text::span<_Ty>>,
__adl::__adl_begin(__input), __adl::__adl_end(__input));
}
}
else {
return __reconstruct(::std::in_place_type<_UInput>, ::std::forward<_Input>(__input));
}
}
}
}

template <typename _Input>
using __span_or_reconstruct_t = decltype(__span_or_reconstruct(::std::declval<_Input>()));
template <typename _Input>
using __span_or_reconstruct_t = decltype(__span_or_reconstruct(::std::declval<_Input>()));

template <typename _Input>
using __string_view_or_span_or_reconstruct_t
= decltype(__string_view_or_span_or_reconstruct(::std::declval<_Input>()));
} // namespace __txt_detail

template <typename _Input>
using __string_view_or_span_or_reconstruct_t
= decltype(__string_view_or_span_or_reconstruct(::std::declval<_Input>()));
} // namespace __txt_detail
ZTD_TEXT_INLINE_ABI_NAMESPACE_CLOSE_I_
} // namespace text

inline namespace __cpo {
namespace ranges { inline namespace __cpo {
//////
/// @brief The reconstruct object is a Customization Point Object (CPO) as defined by the Standard Library in
/// [customization.point.object] (http://eel.is/c++draft/customization.point.object). It is the route for
/// being able to put a range back from various bits and pieces of itself. For more in-depth information, see
/// P1664 (https://thephd.dev/_vendor/future_cxx/papers/d1664.html).
//////
inline constexpr auto& reconstruct = __txt_detail::__reconstruct;
} // namespace __cpo
inline constexpr auto& reconstruct = ::ztd::text::__txt_detail::__reconstruct;
}} // namespace ranges::__cpo

ZTD_TEXT_INLINE_ABI_NAMESPACE_CLOSE_I_
}} // namespace ztd::text
} // namespace ztd

#include <ztd/text/detail/epilogue.hpp>

Expand Down
12 changes: 6 additions & 6 deletions single/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,12 @@ endif()
file(GLOB_RECURSE ztd.text.generated_header_sources LIST_DIRECTORIES false CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/../include/**/*.*)
add_custom_command(
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/include/ztd/text"
COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/single.py" --input "${CMAKE_CURRENT_SOURCE_DIR}/../include" --output "${CMAKE_CURRENT_BINARY_DIR}/include/ztd/text/text.hpp"
COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/single.py" --input "${CMAKE_CURRENT_SOURCE_DIR}/../include" --output "${CMAKE_CURRENT_BINARY_DIR}/include/ztd/text.hpp"
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/single.py" "${ztd.text.generated_header_sources}"
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/include/ztd/text/text.hpp" "${CMAKE_CURRENT_BINARY_DIR}/include/ztd/text/forward.hpp")
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/include/ztd/text.hpp" "${CMAKE_CURRENT_BINARY_DIR}/include/ztd/text/forward.hpp")
add_custom_target(ztd.text.single_header_generator ALL
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/single.py"
"${CMAKE_CURRENT_BINARY_DIR}/include/ztd/text/text.hpp" "${CMAKE_CURRENT_BINARY_DIR}/include/ztd/text/forward.hpp"
"${CMAKE_CURRENT_BINARY_DIR}/include/ztd/text.hpp" "${CMAKE_CURRENT_BINARY_DIR}/include/ztd/text/forward.hpp"
"${ztd.text.generated_header_sources}")

# # # ztd.text generated single header library
Expand All @@ -65,8 +65,8 @@ target_include_directories(ztd.text
add_dependencies(ztd.text.single ztd.text.single_header_generator)

install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/include/ztd/text/text.hpp"
"${CMAKE_CURRENT_BINARY_DIR}/include/ztd/text.hpp"
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/single/ztd)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/include/ztd/text/forward.hpp"
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/single/ztd/text)


2 changes: 1 addition & 1 deletion single/single.py
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ def process_file(filename, out):
forward_include_guard = 'ZTD_TEXT_SINGLE_INCLUDE_FORWARD_HPP'

processed_files = [
os.path.join(project_path, x) for x in ['ztd/text/text.hpp']
os.path.join(project_path, x) for x in ['ztd/text.hpp']
]
forward_processed_files = [
os.path.join(project_path, x) for x in ['ztd/text/forward.hpp']
Expand Down

0 comments on commit 1da2d1d

Please sign in to comment.