tu: Implement fallback linear staging blit for CopyImage
[mesa.git] / src / gallium / state_trackers / clover / util / range.hpp
index 151992ed8f4e24fa247b083ab0481fe72125aba2..b082359ee86cecfe52256696d82380097515e222 100644 (file)
@@ -38,25 +38,25 @@ namespace clover {
    template<typename T, typename V>
    struct range_store_traits;
 
-   template<typename T>
-   struct range_store_traits<T, std::vector<T>> {
+   template<typename T, typename S>
+   struct range_store_traits<T, std::vector<S>> {
       typedef void enable;
 
       template<typename R>
-      static std::vector<T>
+      static std::vector<S>
       create(const R &r) {
          return { r.begin(), r.end() };
       }
    };
 
-   template<typename T, std::size_t N>
-   struct range_store_traits<T, std::array<T, N>> {
+   template<typename T, typename S, std::size_t N>
+   struct range_store_traits<T, std::array<S, N>> {
       typedef void enable;
 
       template<typename R>
-      static std::array<T, N>
+      static std::array<S, N>
       create(const R &r) {
-         std::array<T, N> v;
+         std::array<S, N> v;
          assert(r.size() == v.size());
          copy(r, v.begin());
          return v;
@@ -218,14 +218,6 @@ namespace clover {
    namespace detail {
       template<typename T>
       using preferred_iterator_type = decltype(std::declval<T>().begin());
-
-      template<typename F, typename... Os>
-      using adaptor_iterator = detail::iterator_adaptor<
-         F, preferred_iterator_type<Os>...>;
-
-      template<typename F, typename... Os>
-      using adaptor_const_iterator = detail::iterator_adaptor<
-         F, preferred_iterator_type<const Os>...>;
    }
 
    ///
@@ -236,12 +228,17 @@ namespace clover {
    template<typename F, typename... Os>
    class adaptor_range :
       public detail::basic_range<adaptor_range<F, Os...>,
-                                 detail::adaptor_iterator<F, Os...>,
-                                 detail::adaptor_const_iterator<F, Os...>> {
+                                 detail::iterator_adaptor<
+                                    F, detail::preferred_iterator_type<Os>...>,
+                                 detail::iterator_adaptor<
+                                    F, detail::preferred_iterator_type<const Os>...>
+                                 > {
    public:
       typedef detail::basic_range<adaptor_range<F, Os...>,
-                                  detail::adaptor_iterator<F, Os...>,
-                                  detail::adaptor_const_iterator<F, Os...>
+                                  detail::iterator_adaptor<
+                                     F, detail::preferred_iterator_type<Os>...>,
+                                  detail::iterator_adaptor<
+                                     F, detail::preferred_iterator_type<const Os>...>
                                   > super;
 
       template<typename G, typename... Rs>
@@ -254,25 +251,26 @@ namespace clover {
          return f == r.f && os == r.os;
       }
 
-      detail::adaptor_iterator<F, Os...>
+      typename super::iterator
       begin() {
          return { f, tuple::map(begins(), os) };
       }
 
-      detail::adaptor_iterator<F, Os...>
+      typename super::iterator
       end() {
          return { f, tuple::map(advances_by(size()),
                                 tuple::map(begins(), os)) };
       }
 
-      detail::adaptor_const_iterator<F, Os...>
+      typename super::const_iterator
       begin() const {
          return { f, tuple::map(begins(), os) };
       }
 
-      detail::adaptor_const_iterator<F, Os...>
+      typename super::const_iterator
       end() const {
-         return { f, tuple::map(ends(), os) };
+         return { f, tuple::map(advances_by(size()),
+                                tuple::map(begins(), os)) };
       }
 
       typename super::size_type