flatten partially works
parent
d8f943ba62
commit
e48fdf0c86
|
@ -1,6 +1,6 @@
|
||||||
cmake_minimum_required(VERSION 3.20)
|
cmake_minimum_required(VERSION 3.20)
|
||||||
include(cmake/color.cmake)
|
include(cmake/color.cmake)
|
||||||
set(BLT_VERSION 4.0.33)
|
set(BLT_VERSION 4.0.34)
|
||||||
|
|
||||||
set(BLT_TARGET BLT)
|
set(BLT_TARGET BLT)
|
||||||
|
|
||||||
|
|
|
@ -25,17 +25,6 @@ namespace blt
|
||||||
{
|
{
|
||||||
namespace iterator
|
namespace iterator
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* struct which is returned by the enumerator.
|
|
||||||
* @tparam T type to store.
|
|
||||||
*/
|
|
||||||
template <typename T>
|
|
||||||
struct enumerate_item
|
|
||||||
{
|
|
||||||
const size_t index;
|
|
||||||
T value;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Iter>
|
template <typename Iter>
|
||||||
class enumerate_wrapper : public passthrough_wrapper<Iter, enumerate_wrapper<Iter>>
|
class enumerate_wrapper : public passthrough_wrapper<Iter, enumerate_wrapper<Iter>>
|
||||||
{
|
{
|
||||||
|
|
|
@ -20,43 +20,34 @@
|
||||||
#define BLT_ITERATOR_FLATTEN_H
|
#define BLT_ITERATOR_FLATTEN_H
|
||||||
|
|
||||||
#include <blt/iterator/common.h>
|
#include <blt/iterator/common.h>
|
||||||
|
#include <blt/meta/type_traits.h>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
|
|
||||||
namespace blt::iterator
|
namespace blt::iterator
|
||||||
{
|
{
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
template<typename T>
|
template <typename Tuple>
|
||||||
struct make_tuple
|
static auto flatten(Tuple&& tuple) -> decltype(auto)
|
||||||
{
|
{
|
||||||
using type = std::tuple<T>;
|
using Decay = std::decay_t<Tuple>;
|
||||||
|
if constexpr (meta::is_tuple_v<Decay> || meta::is_pair_v<Decay>)
|
||||||
static auto convert(T& f)
|
|
||||||
{
|
{
|
||||||
return std::forward_as_tuple(f);
|
return std::apply([](auto&&... args)
|
||||||
}
|
{
|
||||||
|
return std::tuple_cat(flatten(std::forward<decltype(args)>(args))...);
|
||||||
static auto convert(T&& f)
|
}, std::forward<Tuple>(tuple));
|
||||||
|
} else
|
||||||
{
|
{
|
||||||
return std::forward_as_tuple(f);
|
if constexpr (std::is_lvalue_reference_v<Tuple>)
|
||||||
|
{
|
||||||
|
return std::forward_as_tuple(std::forward<Tuple>(tuple));
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
return std::make_tuple(std::forward<Tuple>(tuple));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
template<typename... Args>
|
|
||||||
struct make_tuple<std::tuple<Args...>>
|
|
||||||
{
|
|
||||||
using type = std::tuple<Args...>;
|
|
||||||
|
|
||||||
static std::tuple<Args...>& convert(std::tuple<Args...>& lvalue)
|
|
||||||
{
|
|
||||||
return lvalue;
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::tuple<Args...>&& convert(std::tuple<Args...>&& rvalue)
|
|
||||||
{
|
|
||||||
return rvalue;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Iter>
|
template <typename Iter>
|
||||||
|
@ -64,19 +55,19 @@ namespace blt::iterator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
using iterator_category = typename std::iterator_traits<Iter>::iterator_category;
|
using iterator_category = typename std::iterator_traits<Iter>::iterator_category;
|
||||||
// using value_type = std::invoke_result_t<Func, meta::deref_return_t<Iter>>;
|
using value_type = std::remove_reference_t<decltype(detail::flatten(*std::declval<Iter>()))>;
|
||||||
using difference_type = ptrdiff_t;
|
using difference_type = ptrdiff_t;
|
||||||
// using pointer = value_type;
|
using pointer = value_type*;
|
||||||
// using reference = value_type;
|
using reference = value_type&;
|
||||||
|
|
||||||
explicit flatten_wrapper(Iter iter):
|
explicit flatten_wrapper(Iter iter):
|
||||||
deref_only_wrapper<Iter, flatten_wrapper<Iter>>(std::move(iter))
|
deref_only_wrapper<Iter, flatten_wrapper>(std::move(iter))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
reference operator*() const
|
auto operator*() const -> decltype(auto)
|
||||||
{
|
{
|
||||||
return func(*this->iter);
|
return detail::flatten(*this->iter);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,8 @@
|
||||||
#ifndef BLT_ITERATOR_FWDDECL_H
|
#ifndef BLT_ITERATOR_FWDDECL_H
|
||||||
#define BLT_ITERATOR_FWDDECL_H
|
#define BLT_ITERATOR_FWDDECL_H
|
||||||
|
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
namespace blt
|
namespace blt
|
||||||
{
|
{
|
||||||
template<typename... Iter>
|
template<typename... Iter>
|
||||||
|
@ -33,7 +35,7 @@ namespace blt
|
||||||
struct iterator_pair;
|
struct iterator_pair;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct enumerate_item;
|
using enumerate_item = std::pair<size_t, T>;
|
||||||
|
|
||||||
template<typename Iter>
|
template<typename Iter>
|
||||||
class enumerate_wrapper;
|
class enumerate_wrapper;
|
||||||
|
|
|
@ -24,6 +24,15 @@
|
||||||
|
|
||||||
namespace blt::meta
|
namespace blt::meta
|
||||||
{
|
{
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
template<typename... Args>
|
||||||
|
void empty_apply_function(Args...)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
using remove_cvref_t = std::remove_volatile_t<std::remove_const_t<std::remove_reference_t<T>>>;
|
using remove_cvref_t = std::remove_volatile_t<std::remove_const_t<std::remove_reference_t<T>>>;
|
||||||
|
|
||||||
|
@ -50,15 +59,24 @@ namespace blt::meta
|
||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template <typename T>
|
||||||
static constexpr bool is_tuple_v = is_tuple<T>::value;
|
static constexpr bool is_tuple_v = is_tuple<T>::value;
|
||||||
|
|
||||||
template<typename T>
|
template <typename T>
|
||||||
static constexpr bool is_pair_v = is_pair<T>::value;
|
static constexpr bool is_pair_v = is_pair<T>::value;
|
||||||
|
|
||||||
template<typename T>
|
template <typename, typename = void>
|
||||||
static constexpr bool is_tuple_like_v = is_tuple_v<T> || is_pair_v<T>;
|
struct is_tuple_like : std::false_type
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
struct is_tuple_like<T, std::void_t<std::tuple_size<T>, std::tuple_element<0, T>>> : std::true_type
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline constexpr bool is_tuple_like_v = is_tuple_like<T>::value;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // BLT_META_TYPE_TRAITS_H
|
#endif // BLT_META_TYPE_TRAITS_H
|
||||||
|
|
Loading…
Reference in New Issue