Advertisement
Guest User

for_Lost206_1

a guest
Mar 11th, 2016
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.05 KB | None | 0 0
  1.  
  2. #include <type_traits>
  3. #include <cassert>
  4. #include <array>
  5. struct has_iterator_impl {
  6.   template<typename T>
  7.   static std::true_type check(typename T::iterator*);
  8.  
  9.   template<typename T>
  10.   static std::false_type check(...);
  11. };
  12.  
  13. template<typename T>
  14. class has_iterator :
  15.   public decltype(has_iterator_impl::check<T>(nullptr)) {};
  16. struct has_const_iterator_impl {
  17.   template<typename T>
  18.   static std::true_type check(typename T::const_iterator*);
  19.  
  20.   template<typename T>
  21.   static std::false_type check(...);
  22. };
  23.  
  24. template<typename T>
  25. class has_const_iterator :
  26.   public decltype(has_iterator_impl::check<T>(nullptr)) {};
  27.  
  28. template<typename T>
  29.   struct is_container : std::integral_constant<bool, has_const_iterator<T>::value && has_iterator<T>::value>
  30.   { };
  31.  
  32.  
  33. template<typename T, std::size_t N, std::enable_if_t<2 <= N, std::nullptr_t> = nullptr>
  34. constexpr Vec2<T> make_Vec2(const T(&arr)[N]) noexcept(std::is_nothrow_copy_constructible<T>::value){
  35.     return {arr[0], arr[1]};
  36. }
  37. template<typename T, std::size_t N, std::enable_if_t<2 <= N, std::nullptr_t> = nullptr>
  38. constexpr Vec2<T> make_Vec2(const std::array<T, N>& arr) noexcept(std::is_nothrow_copy_constructible<T>::value){
  39.     return {arr[0], arr[1]};
  40. }
  41. template<typename Container, std::enable_if_t<is_container<T>::value, std::nullptr_t> = nullptr>
  42. auto make_Vec2(const Container& container) -> Vec2<typename Container::value_type> noexcept(std::is_nothrow_copy_constructible<Container::value_type>::value)
  43. {
  44.     assert(container.size() < 2);
  45.     return {*(container.begin()), *std::next(container.begin(), 1)}
  46. }
  47. template<typename InputIterator>
  48. auto make_Vec2(InputIterator begin, InputIterator end)
  49.  -> Vec2<decltype(*(std::declval<InputIterator>))> noexcept(std::is_nothrow_copy_constructible<*(std::declval<InputIterator>)>::value)
  50. {
  51.     assert(std::distance(begin, end) < 2);
  52.     return {*begin, *std::next(begin, 1)}
  53. }
  54.  
  55. template<typename T, std::size_t N, std::enable_if_t<3 <= N, std::nullptr_t> = nullptr>
  56. constexpr Vec3<T> make_Vec3(const T(&arr)[N]) noexcept(std::is_nothrow_copy_constructible<T>::value){
  57.     return {arr[0], arr[1], arr[2]};
  58. }
  59. template<typename T, std::size_t N, std::enable_if_t<3 <= N, std::nullptr_t> = nullptr>
  60. constexpr Vec3<T> make_Vec3(const std::array<T, N>& arr) noexcept(std::is_nothrow_copy_constructible<T>::value){
  61.     return {arr[0], arr[1], arr[2]};
  62. }
  63. template<typename Container, std::enable_if_t<is_container<T>::value, std::nullptr_t> = nullptr>
  64. auto make_Vec3(const Container& container) -> Vec3<typename Container::value_type> noexcept(std::is_nothrow_copy_constructible<Container::value_type>::value)
  65. {
  66.     assert(container.size() < 3);
  67.     return {*(container.begin()), *std::next(container.begin(), 1), *std::next(container.begin(), 2)}
  68. }
  69. template<typename InputIterator>
  70. auto make_Vec3(InputIterator begin, InputIterator end)
  71.  -> Vec3<decltype(*(std::declval<InputIterator>))> noexcept(std::is_nothrow_copy_constructible<*(std::declval<InputIterator>)>::value)
  72. {
  73.     assert(std::distance(begin, end) < 3);
  74.     return {*begin, *std::next(begin, 1), *std::next(begin, 2)}
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement