/* * Copyright 2008-2012 NVIDIA Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include namespace thrust { template pair ::pair(void) :first(),second() { ; } // end pair::pair() template pair ::pair(const T1 &x, const T2 &y) :first(x),second(y) { ; } // end pair::pair() template template pair ::pair(const pair &p) :first(p.first),second(p.second) { ; } // end pair::pair() template template pair ::pair(const std::pair &p) :first(p.first),second(p.second) { ; } // end pair::pair() template inline __host__ __device__ void pair ::swap(thrust::pair &p) { using thrust::swap; swap(first, p.first); swap(second, p.second); } // end pair::swap() template inline __host__ __device__ bool operator==(const pair &x, const pair &y) { return x.first == y.first && x.second == y.second; } // end operator==() template inline __host__ __device__ bool operator<(const pair &x, const pair &y) { return x.first < y.first || (!(y.first < x.first) && x.second < y.second); } // end operator<() template inline __host__ __device__ bool operator!=(const pair &x, const pair &y) { return !(x == y); } // end operator==() template inline __host__ __device__ bool operator>(const pair &x, const pair &y) { return y < x; } // end operator<() template inline __host__ __device__ bool operator<=(const pair &x, const pair &y) { return !(y < x); } // end operator<=() template inline __host__ __device__ bool operator>=(const pair &x, const pair &y) { return !(x < y); } // end operator>=() template inline __host__ __device__ void swap(pair &x, pair &y) { return x.swap(y); } // end swap() template inline __host__ __device__ pair make_pair(T1 x, T2 y) { return pair(x,y); } // end make_pair() // specializations of tuple_element for pair template struct tuple_element<0, pair > { typedef T1 type; }; // end tuple_element template struct tuple_element<1, pair > { typedef T2 type; }; // end tuple_element // specialization of tuple_size for pair template struct tuple_size< pair > { static const unsigned int value = 2; }; // end tuple_size namespace detail { template struct pair_get {}; template struct pair_get<0, Pair> { inline __host__ __device__ const typename tuple_element<0, Pair>::type & operator()(const Pair &p) const { return p.first; } // end operator()() inline __host__ __device__ typename tuple_element<0, Pair>::type & operator()(Pair &p) const { return p.first; } // end operator()() }; // end pair_get template struct pair_get<1, Pair> { inline __host__ __device__ const typename tuple_element<1, Pair>::type & operator()(const Pair &p) const { return p.second; } // end operator()() inline __host__ __device__ typename tuple_element<1, Pair>::type & operator()(Pair &p) const { return p.second; } // end operator()() }; // end pair_get } // end detail template inline __host__ __device__ typename tuple_element >::type & get(pair &p) { return detail::pair_get >()(p); } // end get() template inline __host__ __device__ const typename tuple_element >::type & get(const pair &p) { return detail::pair_get >()(p); } // end get() } // end thrust