Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <type_traits>
- #include <cassert>
- #include <array>
- struct has_iterator_impl {
- template<typename T>
- static std::true_type check(typename T::iterator*);
- template<typename T>
- static std::false_type check(...);
- };
- template<typename T>
- class has_iterator :
- public decltype(has_iterator_impl::check<T>(nullptr)) {};
- struct has_const_iterator_impl {
- template<typename T>
- static std::true_type check(typename T::const_iterator*);
- template<typename T>
- static std::false_type check(...);
- };
- template<typename T>
- class has_const_iterator :
- public decltype(has_iterator_impl::check<T>(nullptr)) {};
- template<typename T>
- struct is_container : std::integral_constant<bool, has_const_iterator<T>::value && has_iterator<T>::value>
- { };
- template<typename T, std::size_t N, std::enable_if_t<2 <= N, std::nullptr_t> = nullptr>
- constexpr Vec2<T> make_Vec2(const T(&arr)[N]) noexcept(std::is_nothrow_copy_constructible<T>::value){
- return {arr[0], arr[1]};
- }
- template<typename T, std::size_t N, std::enable_if_t<2 <= N, std::nullptr_t> = nullptr>
- constexpr Vec2<T> make_Vec2(const std::array<T, N>& arr) noexcept(std::is_nothrow_copy_constructible<T>::value){
- return {arr[0], arr[1]};
- }
- template<typename Container, std::enable_if_t<is_container<T>::value, std::nullptr_t> = nullptr>
- auto make_Vec2(const Container& container) -> Vec2<typename Container::value_type> noexcept(std::is_nothrow_copy_constructible<Container::value_type>::value)
- {
- assert(container.size() < 2);
- return {*(container.begin()), *std::next(container.begin(), 1)}
- }
- template<typename InputIterator>
- auto make_Vec2(InputIterator begin, InputIterator end)
- -> Vec2<decltype(*(std::declval<InputIterator>))> noexcept(std::is_nothrow_copy_constructible<*(std::declval<InputIterator>)>::value)
- {
- assert(std::distance(begin, end) < 2);
- return {*begin, *std::next(begin, 1)}
- }
- template<typename T, std::size_t N, std::enable_if_t<3 <= N, std::nullptr_t> = nullptr>
- constexpr Vec3<T> make_Vec3(const T(&arr)[N]) noexcept(std::is_nothrow_copy_constructible<T>::value){
- return {arr[0], arr[1], arr[2]};
- }
- template<typename T, std::size_t N, std::enable_if_t<3 <= N, std::nullptr_t> = nullptr>
- constexpr Vec3<T> make_Vec3(const std::array<T, N>& arr) noexcept(std::is_nothrow_copy_constructible<T>::value){
- return {arr[0], arr[1], arr[2]};
- }
- template<typename Container, std::enable_if_t<is_container<T>::value, std::nullptr_t> = nullptr>
- auto make_Vec3(const Container& container) -> Vec3<typename Container::value_type> noexcept(std::is_nothrow_copy_constructible<Container::value_type>::value)
- {
- assert(container.size() < 3);
- return {*(container.begin()), *std::next(container.begin(), 1), *std::next(container.begin(), 2)}
- }
- template<typename InputIterator>
- auto make_Vec3(InputIterator begin, InputIterator end)
- -> Vec3<decltype(*(std::declval<InputIterator>))> noexcept(std::is_nothrow_copy_constructible<*(std::declval<InputIterator>)>::value)
- {
- assert(std::distance(begin, end) < 3);
- return {*begin, *std::next(begin, 1), *std::next(begin, 2)}
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement