Skip to content

Commit

Permalink
Move stuff related to implementation to detail namespace
Browse files Browse the repository at this point in the history
  • Loading branch information
md committed Mar 14, 2017
1 parent 741cc44 commit b274d8b
Show file tree
Hide file tree
Showing 7 changed files with 154 additions and 109 deletions.
27 changes: 16 additions & 11 deletions project/include/variadic/at.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,23 +27,28 @@ namespace variadic
// using type = typename at<Idx - 1, Types...>::type;
// };

template <size_t Idx, typename = std::make_index_sequence<Idx>>
struct at_frame_impl;

template <size_t Idx, size_t... Ignore>
struct at_frame_impl<Idx, std::index_sequence<Ignore...>>
namespace detail
{
template <typename T>
static T deducer(decltype((void*)Ignore)..., T*, ...);
};

template <size_t Idx, typename... Types>
using at_frame = decltype(at_frame_impl<Idx>::deducer(static_cast<type_frame<Types>*>(nullptr)...));
template <size_t Idx, typename = std::make_index_sequence<Idx>>
struct at_frame_impl;

template <size_t Idx, size_t... Ignore>
struct at_frame_impl<Idx, std::index_sequence<Ignore...>>
{
template <typename T>
static T deducer(decltype((void*)Ignore)..., T*, ...);
};

template <size_t Idx, typename... Types>
using at_frame = decltype(at_frame_impl<Idx>::deducer(static_cast<type_frame<Types>*>(nullptr)...));

} // namespace detail

template <size_t Idx, typename... Types>
struct at
{
using type = typename at_frame<Idx, Types...>::type;
using type = typename detail::at_frame<Idx, Types...>::type;
};

} // namespace variadic
28 changes: 18 additions & 10 deletions project/include/variadic/first.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,26 @@
namespace variadic
{

template <typename... Types>
struct first;
namespace detail
{

template <>
struct first<>
{};
template <typename... Types>
struct first_frame;

template <typename T, typename... Types>
struct first<T, Types...>
{
using type = T;
};
template <>
struct first_frame<>
{};

template <typename T, typename... Types>
struct first_frame<T, Types...>
{
using type = T;
};

} // namespace detail

template <typename... Types>
using first = detail::first_frame<Types...>;

template <typename T, typename... Types>
using not_first = collection<Types...>;
Expand Down
45 changes: 27 additions & 18 deletions project/include/variadic/last.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,29 +32,38 @@ namespace variadic
// using type = typename last<Y, Types...>::type;
// };

template <typename... Types>
struct last;

template <>
struct last<>
{};

template <typename T, typename... Types>
struct last<T, Types...>
namespace detail
{
using type = typename at<sizeof...(Types), T, Types...>::type;
};

template <class Sequence, typename... Types>
struct not_last_frame;
template <typename... Types>
struct last_frame;

template <size_t... Idxs, typename... Types>
struct not_last_frame<std::index_sequence<Idxs...>, Types...>
{
using types = collection<typename at<Idxs, Types...>::type...>;
};
template <>
struct last_frame<>
{};

template <typename T, typename... Types>
struct last_frame<T, Types...>
{
using type = typename at<sizeof...(Types), T, Types...>::type;
};

template <class Sequence, typename... Types>
struct not_last_frame;

template <size_t... Idxs, typename... Types>
struct not_last_frame<std::index_sequence<Idxs...>, Types...>
{
using types = collection<typename at<Idxs, Types...>::type...>;
};

} // namespace detail

template <typename... Types>
using last = detail::last_frame<Types...>;

template <typename... Types>
using not_last = typename not_last_frame<std::make_index_sequence<sizeof...(Types) - 1>, Types...>::types;
using not_last = typename detail::not_last_frame<std::make_index_sequence<sizeof...(Types) - 1>, Types...>::types;

} // namespace variadic
31 changes: 18 additions & 13 deletions project/include/variadic/merge.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,28 @@
namespace variadic
{

template <typename ResultCollection, typename... Collections>
struct merge_frame;

template <typename ResultCollection>
struct merge_frame<ResultCollection>
namespace detail
{
using types = ResultCollection;
};

template <typename ResultCollection, typename C0, typename... Collections>
struct merge_frame<ResultCollection, C0, Collections...>
{
using types = typename merge_frame<typename C0::template emplace<ResultCollection::template push_back>, Collections...>::types;
};
template <typename ResultCollection, typename... Collections>
struct merge_frame;

template <typename ResultCollection>
struct merge_frame<ResultCollection>
{
using types = ResultCollection;
};

template <typename ResultCollection, typename C0, typename... Collections>
struct merge_frame<ResultCollection, C0, Collections...>
{
using types = typename merge_frame<typename C0::template emplace<ResultCollection::template push_back>, Collections...>::types;
};

} // namespace detail

template <typename... Collections>
using merge = typename merge_frame<collection<>, Collections...>::types;
using merge = typename detail::merge_frame<collection<>, Collections...>::types;

template <typename... Types>
struct merge_types
Expand Down
36 changes: 22 additions & 14 deletions project/include/variadic/nested_type.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,29 @@
namespace variadic
{

template <template <typename> typename ... Types>
struct nested_type;

template <>
struct nested_type<>
namespace detail
{
template <typename Y>
using type = Y;
};

template <template <typename> typename T, template <typename> typename ... Types>
struct nested_type<T, Types...>
{
template <typename Y>
using type = T<typename nested_type<Types...>::template type<Y>>;
};
template <template <typename> typename ... Types>
struct nested_type;

template <>
struct nested_type<>
{
template <typename Y>
using type = Y;
};

template <template <typename> typename T, template <typename> typename ... Types>
struct nested_type<T, Types...>
{
template <typename Y>
using type = T<typename nested_type<Types...>::template type<Y>>;
};

} // namespace detail

template <template <typename> typename ... Types>
using nested_type = detail::nested_type<Types...>;

} // namespace variadic
31 changes: 18 additions & 13 deletions project/include/variadic/reverse.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,22 +10,27 @@
namespace variadic
{

template <typename ResultCollection, typename... Types>
struct reverse_frame;

template <typename ResultCollection>
struct reverse_frame<ResultCollection>
namespace detail
{
using types = ResultCollection;
};

template <typename ResultCollection, typename T, typename... Types>
struct reverse_frame<ResultCollection, T, Types...>
{
using types = typename reverse_frame<typename ResultCollection::template push_front<T>, Types...>::types;
};
template <typename ResultCollection, typename... Types>
struct reverse_frame;

template <typename ResultCollection>
struct reverse_frame<ResultCollection>
{
using types = ResultCollection;
};

template <typename ResultCollection, typename T, typename... Types>
struct reverse_frame<ResultCollection, T, Types...>
{
using types = typename reverse_frame<typename ResultCollection::template push_front<T>, Types...>::types;
};

} // namespace detail

template <typename... Types>
using reverse = typename reverse_frame<collection<>, Types...>::types;
using reverse = typename detail::reverse_frame<collection<>, Types...>::types;

} // namespace variadic
65 changes: 35 additions & 30 deletions project/include/variadic/skip.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,50 +13,55 @@
namespace variadic
{

template <size_t Count, countdown::condition_type condition, typename... Types>
struct skip_front_frame;

template <typename... Types>
struct skip_front_frame<0, countdown::final_value, Types...>
namespace detail
{
using types = collection<Types...>;
};

template <size_t Count, typename T, typename... Types>
struct skip_front_frame<Count, countdown::continue_value, T, Types...>
{
template <typename... NextTypes>
using next = skip_front_frame<Count-1, countdown::condition(Count-1), NextTypes...>;
template <size_t Count, countdown::condition_type condition, typename... Types>
struct skip_front_frame;

using types = typename not_first<T, Types...>::template emplace<next>::types;
};
template <typename... Types>
struct skip_front_frame<0, countdown::final_value, Types...>
{
using types = collection<Types...>;
};

template <size_t Count, countdown::condition_type condition, typename... Types>
struct skip_back_frame;
template <size_t Count, typename T, typename... Types>
struct skip_front_frame<Count, countdown::continue_value, T, Types...>
{
template <typename... NextTypes>
using next = skip_front_frame<Count-1, countdown::condition(Count-1), NextTypes...>;

template <typename... Types>
struct skip_back_frame<0, countdown::final_value, Types...>
{
using types = collection<Types...>;
};
using types = typename not_first<T, Types...>::template emplace<next>::types;
};

template <size_t Count, typename T, typename... Types>
struct skip_back_frame<Count, countdown::continue_value, T, Types...>
{
template <typename... NextTypes>
using next = skip_back_frame<Count-1, countdown::condition(Count-1), NextTypes...>;
template <size_t Count, countdown::condition_type condition, typename... Types>
struct skip_back_frame;

using types = typename not_last<T, Types...>::template emplace<next>::types;
};
template <typename... Types>
struct skip_back_frame<0, countdown::final_value, Types...>
{
using types = collection<Types...>;
};

template <size_t Count, typename T, typename... Types>
struct skip_back_frame<Count, countdown::continue_value, T, Types...>
{
template <typename... NextTypes>
using next = skip_back_frame<Count-1, countdown::condition(Count-1), NextTypes...>;

using types = typename not_last<T, Types...>::template emplace<next>::types;
};

} // namespace detail

template <size_t Count>
struct skip
{
template <typename... Types>
using front = typename skip_front_frame<Count, countdown::condition(Count), Types...>::types;
using front = typename detail::skip_front_frame<Count, countdown::condition(Count), Types...>::types;

template <typename... Types>
using back = typename skip_back_frame<Count, countdown::condition(Count), Types...>::types;
using back = typename detail::skip_back_frame<Count, countdown::condition(Count), Types...>::types;
};

} // namespace variadic

0 comments on commit b274d8b

Please sign in to comment.