Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
vo-nil committed Dec 12, 2024
1 parent 8086247 commit 6ebb7f6
Show file tree
Hide file tree
Showing 8 changed files with 56 additions and 61 deletions.
17 changes: 6 additions & 11 deletions crypto3/libs/marshalling/core/include/nil/detail/type_traits.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -206,16 +206,15 @@
};
#endif

namespace nil::crypto3 {
namespace nil::crypto3::marshalling {
namespace detail {

// GENERATE_HAS_MEMBER_TYPE(iterator)
// GENERATE_HAS_MEMBER_TYPE(const_iterator)
GENERATE_HAS_MEMBER_TYPE(iterator)
GENERATE_HAS_MEMBER_TYPE(const_iterator)

// GENERATE_HAS_MEMBER_CONST_RETURN_FUNCTION(begin, const_iterator)
// GENERATE_HAS_MEMBER_CONST_RETURN_FUNCTION(end, const_iterator)
GENERATE_HAS_MEMBER_CONST_RETURN_FUNCTION(begin, const_iterator)
GENERATE_HAS_MEMBER_CONST_RETURN_FUNCTION(end, const_iterator)

/*
template<typename T>
struct is_iterator {
static char test(...);
Expand All @@ -228,22 +227,18 @@ namespace nil::crypto3 {
static long test(U &&);

constexpr static bool value = std::is_same<decltype(test(std::declval<T>())), long>::value;
};*/
};

/*
template<typename Range>
struct is_range {
static const bool value = has_begin<Range>::value && has_end<Range>::value;
};
*/

/*
template<typename Container>
struct is_container {
static const bool value
= has_const_iterator<Container>::value && has_begin<Container>::value && has_end<Container>::value;
};
*/

/// @brief Check whether provided type is a variant of
/// <a href="http://en.cppreference.com/w/cpp/utility/tuple">std::tuple</a>.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ namespace nil::crypto3 {
*/
template<typename TOutputEndian = option::big_endian, typename TInputEndian = option::big_endian, typename SinglePassRange>
typename std::enable_if<
nil::crypto3::detail::is_range<SinglePassRange>::value,
detail::is_range<SinglePassRange>::value,
detail::range_repack_impl<TInputEndian, TOutputEndian, typename SinglePassRange::const_iterator>>::type

pack(const SinglePassRange &val, status_type &status) {
Expand All @@ -69,7 +69,7 @@ namespace nil::crypto3 {
}

template<typename TOutputEndian = option::big_endian, typename TInputEndian = option::big_endian, typename TInput>
typename std::enable_if<!nil::crypto3::detail::is_range<TInput>::value,
typename std::enable_if<!detail::is_range<TInput>::value,
detail::value_repack_impl<TInputEndian, TOutputEndian, TInput>>::type

pack(const TInput &val, status_type &status) {
Expand All @@ -93,7 +93,7 @@ namespace nil::crypto3 {
*/
template<typename TOutputEndian = option::big_endian, typename TInputEndian = option::big_endian, typename InputIterator>
typename std::enable_if<
nil::crypto3::detail::is_iterator<InputIterator>::value
detail::is_iterator<InputIterator>::value
&& std::is_integral<typename std::iterator_traits<InputIterator>::value_type>::value,
detail::range_repack_impl<TInputEndian, TOutputEndian, InputIterator>>::type
pack(InputIterator first, InputIterator last, status_type &status) {
Expand All @@ -102,7 +102,7 @@ namespace nil::crypto3 {
}

template<typename TOutputEndian = option::big_endian, typename TInputEndian = option::big_endian, typename TInput, typename TOutputIterator>
typename std::enable_if<!nil::crypto3::detail::is_range<TInput>::value && nil::crypto3::detail::is_iterator<TOutputIterator>::value,
typename std::enable_if<!detail::is_range<TInput>::value && detail::is_iterator<TOutputIterator>::value,
TOutputIterator>::type
pack(const TInput &val, TOutputIterator out, status_type &status) {
using T = typename std::iterator_traits<TOutputIterator>::value_type;
Expand All @@ -111,8 +111,8 @@ namespace nil::crypto3 {
}

template<typename TOutputEndian = option::big_endian, typename TInputEndian = option::big_endian, typename SinglePassRange, typename TOutputIterator>
typename std::enable_if<nil::crypto3::detail::is_range<SinglePassRange>::value
&& nil::crypto3::detail::is_iterator<TOutputIterator>::value,
typename std::enable_if<detail::is_range<SinglePassRange>::value
&& detail::is_iterator<TOutputIterator>::value,
TOutputIterator>::type
pack(const SinglePassRange &rng_input, TOutputIterator out, status_type &status) {
BOOST_RANGE_CONCEPT_ASSERT((boost::SinglePassRangeConcept<const SinglePassRange>));
Expand All @@ -122,8 +122,8 @@ namespace nil::crypto3 {
}

template<typename TOutputEndian = option::big_endian, typename TInputEndian = option::big_endian, typename InputIterator, typename TOutputIterator>
typename std::enable_if<nil::crypto3::detail::is_iterator<InputIterator>::value
&& nil::crypto3::detail::is_iterator<TOutputIterator>::value,
typename std::enable_if<detail::is_iterator<InputIterator>::value
&& detail::is_iterator<TOutputIterator>::value,
TOutputIterator>::type
pack(InputIterator first, InputIterator last, TOutputIterator out, status_type &status) {
using T = typename std::iterator_traits<TOutputIterator>::value_type;
Expand All @@ -132,7 +132,7 @@ namespace nil::crypto3 {
}

template<typename TOutputEndian = option::big_endian, typename TInputEndian = option::big_endian, typename TInput, typename SinglePassRange>
typename std::enable_if<!nil::crypto3::detail::is_range<TInput>::value && nil::crypto3::detail::is_range<SinglePassRange>::value
typename std::enable_if<!detail::is_range<TInput>::value && detail::is_range<SinglePassRange>::value
&& std::is_constructible<SinglePassRange,
typename std::vector<typename SinglePassRange::value_type>::const_iterator,
typename std::vector<typename SinglePassRange::value_type>::const_iterator>::value,
Expand All @@ -147,7 +147,7 @@ namespace nil::crypto3 {
}

template<typename TOutputEndian = option::big_endian, typename TInputEndian = option::big_endian, typename TInput, typename SinglePassRange>
typename std::enable_if<!nil::crypto3::detail::is_range<TInput>::value && nil::crypto3::detail::is_range<SinglePassRange>::value
typename std::enable_if<!detail::is_range<TInput>::value && detail::is_range<SinglePassRange>::value
&& !std::is_constructible<SinglePassRange,
typename std::vector<typename SinglePassRange::value_type>::const_iterator,
typename std::vector<typename SinglePassRange::value_type>::const_iterator>::value,
Expand All @@ -161,8 +161,8 @@ namespace nil::crypto3 {
}

template<typename TOutputEndian = option::big_endian, typename TInputEndian = option::big_endian, typename SinglePassRange1, typename SinglePassRange2>
typename std::enable_if<nil::crypto3::detail::is_range<SinglePassRange1>::value
&& nil::crypto3::detail::is_range<SinglePassRange2>::value
typename std::enable_if<detail::is_range<SinglePassRange1>::value
&& detail::is_range<SinglePassRange2>::value
&& std::is_constructible<SinglePassRange2,
typename SinglePassRange2::const_iterator,
typename SinglePassRange2::const_iterator>::value,
Expand All @@ -179,7 +179,7 @@ namespace nil::crypto3 {

template<typename TOutputEndian = option::big_endian, typename TInputEndian = option::big_endian, typename SinglePassRange1, typename SinglePassRange2>
typename std::enable_if<
nil::crypto3::detail::is_range<SinglePassRange1>::value && nil::crypto3::detail::is_range<SinglePassRange2>::value
detail::is_range<SinglePassRange1>::value && detail::is_range<SinglePassRange2>::value
&& !std::is_constructible<
SinglePassRange2,
typename std::vector<typename SinglePassRange2::value_type>::const_iterator,
Expand All @@ -195,7 +195,7 @@ namespace nil::crypto3 {

template<typename TOutputEndian = option::big_endian, typename TInputEndian = option::big_endian, typename InputIterator, typename SinglePassRange>
typename std::enable_if<
nil::crypto3::detail::is_iterator<InputIterator>::value && nil::crypto3::detail::is_range<SinglePassRange>::value
detail::is_iterator<InputIterator>::value && detail::is_range<SinglePassRange>::value
&& std::is_constructible<
SinglePassRange,
typename std::vector<typename SinglePassRange::value_type>::const_iterator,
Expand All @@ -211,8 +211,8 @@ namespace nil::crypto3 {
}

template<typename TOutputEndian = option::big_endian, typename TInputEndian = option::big_endian, typename InputIterator, typename SinglePassRange>
typename std::enable_if<nil::crypto3::detail::is_iterator<InputIterator>::value
&& nil::crypto3::detail::is_range<SinglePassRange>::value
typename std::enable_if<detail::is_iterator<InputIterator>::value
&& detail::is_range<SinglePassRange>::value
&& !std::is_constructible<SinglePassRange,
typename SinglePassRange::const_iterator,
typename SinglePassRange::const_iterator>::value,
Expand All @@ -225,8 +225,8 @@ namespace nil::crypto3 {
}

template<typename TOutputEndian = option::big_endian, typename TInputEndian = option::big_endian, typename InputIterator, typename TOutput>
typename std::enable_if<nil::crypto3::detail::is_iterator<InputIterator>::value
&& !(nil::crypto3::detail::is_range<TOutput>::value || nil::crypto3::detail::is_array<TOutput>::value)
typename std::enable_if<detail::is_iterator<InputIterator>::value
&& !(detail::is_range<TOutput>::value || detail::is_array<TOutput>::value)
&& !std::is_same<TOutput, status_type>::value,
status_type>::type
pack(InputIterator first, InputIterator last, TOutput &rng_output) {
Expand All @@ -237,8 +237,8 @@ namespace nil::crypto3 {
}

template<typename TOutputEndian = option::big_endian, typename TInputEndian = option::big_endian, typename SinglePassRange, typename TOutput>
typename std::enable_if<nil::crypto3::detail::is_range<SinglePassRange>::value
&& !(nil::crypto3::detail::is_range<TOutput>::value || nil::crypto3::detail::is_array<TOutput>::value)
typename std::enable_if<detail::is_range<SinglePassRange>::value
&& !(detail::is_range<TOutput>::value || detail::is_array<TOutput>::value)
&& !std::is_same<TOutput, status_type>::value,
status_type>::type
pack(const SinglePassRange &rng_input, TOutput &rng_output) {
Expand All @@ -249,7 +249,7 @@ namespace nil::crypto3 {
}

template<typename TOutputEndian = option::big_endian, typename TInputEndian = option::big_endian, typename TInput, typename TOutputIterator>
typename std::enable_if<!nil::crypto3::detail::is_range<TInput>::value && nil::crypto3::detail::is_iterator<TOutputIterator>::value,
typename std::enable_if<!detail::is_range<TInput>::value && detail::is_iterator<TOutputIterator>::value,
status_type>::type

pack(const TInput &val, TOutputIterator out) {
Expand All @@ -261,8 +261,8 @@ namespace nil::crypto3 {
}

template<typename TOutputEndian = option::big_endian, typename TInputEndian = option::big_endian, typename SinglePassRange, typename TOutputIterator>
typename std::enable_if<nil::crypto3::detail::is_range<SinglePassRange>::value
&& nil::crypto3::detail::is_iterator<TOutputIterator>::value,
typename std::enable_if<detail::is_range<SinglePassRange>::value
&& detail::is_iterator<TOutputIterator>::value,
status_type>::type
pack(const SinglePassRange &rng_input, TOutputIterator out) {
BOOST_RANGE_CONCEPT_ASSERT((boost::SinglePassRangeConcept<const SinglePassRange>));
Expand All @@ -274,8 +274,8 @@ namespace nil::crypto3 {
}

template<typename TOutputEndian = option::big_endian, typename TInputEndian = option::big_endian, typename InputIterator, typename TOutputIterator>
typename std::enable_if<nil::crypto3::detail::is_iterator<InputIterator>::value
&& nil::crypto3::detail::is_iterator<TOutputIterator>::value,
typename std::enable_if<detail::is_iterator<InputIterator>::value
&& detail::is_iterator<TOutputIterator>::value,
status_type>::type
pack(InputIterator first, InputIterator last, TOutputIterator out) {
using T = typename std::iterator_traits<TOutputIterator>::value_type;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,15 +92,15 @@ namespace nil::crypto3 {

template<typename T, size_t SizeArray,
typename = typename std::enable_if<
!nil::crypto3::detail::is_container<typename is_compatible<T>::template type<>>::value>::type>
!detail::is_container<typename is_compatible<T>::template type<>>::value>::type>
inline operator std::array<T, SizeArray>() {

return similar_std_array_marshalling<std::array<T, SizeArray>>();
}

template<typename T, size_t SizeArray,
typename = typename std::enable_if<
!nil::crypto3::detail::is_container<typename is_compatible<T>::template type<>>::value>::type>
!detail::is_container<typename is_compatible<T>::template type<>>::value>::type>
inline operator boost::array<T, SizeArray>() {

return similar_std_array_marshalling<boost::array<T, SizeArray>>();
Expand Down Expand Up @@ -131,7 +131,7 @@ namespace nil::crypto3 {

template<typename OutputRange,
typename = typename std::enable_if<
nil::crypto3::detail::is_range<OutputRange>::value && !is_marshalling_type<OutputRange>::value
detail::is_range<OutputRange>::value && !is_marshalling_type<OutputRange>::value
&& !nil::crypto3::marshalling::is_container<typename is_compatible<
typename OutputRange::value_type>::template type<>>::value>::type>
inline operator OutputRange() {
Expand Down
Loading

0 comments on commit 6ebb7f6

Please sign in to comment.