You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
5.3 KiB
168 lines
5.3 KiB
11 years ago
|
/*
|
||
|
* 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.
|
||
|
*/
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#include <thrust/detail/config.h>
|
||
|
#include <thrust/detail/type_traits.h>
|
||
|
#include <thrust/detail/use_default.h>
|
||
|
#include <thrust/detail/reference_forward_declaration.h>
|
||
|
|
||
|
|
||
|
namespace thrust
|
||
|
{
|
||
|
namespace detail
|
||
|
{
|
||
|
|
||
|
template<typename> struct is_wrapped_reference;
|
||
|
|
||
|
}
|
||
|
|
||
|
// the base type for all of thrust's system-annotated references.
|
||
|
// for reasonable reference-like semantics, derived types must reimplement the following:
|
||
|
// 1. constructor from pointer
|
||
|
// 2. copy constructor
|
||
|
// 3. templated copy constructor from other reference
|
||
|
// 4. templated assignment from other reference
|
||
|
// 5. assignment from value_type
|
||
|
template<typename Element, typename Pointer, typename Derived>
|
||
|
class reference
|
||
|
{
|
||
|
private:
|
||
|
typedef typename thrust::detail::eval_if<
|
||
|
thrust::detail::is_same<Derived,use_default>::value,
|
||
|
thrust::detail::identity_<reference>,
|
||
|
thrust::detail::identity_<Derived>
|
||
|
>::type derived_type;
|
||
|
|
||
|
// hint for is_wrapped_reference lets it know that this type (or a derived type)
|
||
|
// is a wrapped reference
|
||
|
struct wrapped_reference_hint {};
|
||
|
template<typename> friend struct thrust::detail::is_wrapped_reference;
|
||
|
|
||
|
public:
|
||
|
typedef Pointer pointer;
|
||
|
typedef typename thrust::detail::remove_const<Element>::type value_type;
|
||
|
|
||
|
__host__ __device__
|
||
|
explicit reference(const pointer &ptr);
|
||
|
|
||
|
template<typename OtherElement, typename OtherPointer, typename OtherDerived>
|
||
|
__host__ __device__
|
||
|
reference(const reference<OtherElement,OtherPointer,OtherDerived> &other,
|
||
|
typename thrust::detail::enable_if_convertible<
|
||
|
typename reference<OtherElement,OtherPointer,OtherDerived>::pointer,
|
||
|
pointer
|
||
|
>::type * = 0);
|
||
|
|
||
|
__host__ __device__
|
||
|
derived_type &operator=(const reference &other);
|
||
|
|
||
|
// XXX this may need an enable_if
|
||
|
template<typename OtherElement, typename OtherPointer, typename OtherDerived>
|
||
|
__host__ __device__
|
||
|
derived_type &operator=(const reference<OtherElement,OtherPointer,OtherDerived> &other);
|
||
|
|
||
|
__host__ __device__
|
||
|
derived_type &operator=(const value_type &x);
|
||
|
|
||
|
__host__ __device__
|
||
|
pointer operator&() const;
|
||
|
|
||
|
__host__ __device__
|
||
|
operator value_type () const;
|
||
|
|
||
|
__host__ __device__
|
||
|
void swap(derived_type &other);
|
||
|
|
||
|
derived_type &operator++();
|
||
|
|
||
|
value_type operator++(int);
|
||
|
|
||
|
// XXX parameterize the type of rhs
|
||
|
derived_type &operator+=(const value_type &rhs);
|
||
|
|
||
|
derived_type &operator--();
|
||
|
|
||
|
value_type operator--(int);
|
||
|
|
||
|
// XXX parameterize the type of rhs
|
||
|
derived_type &operator-=(const value_type &rhs);
|
||
|
|
||
|
// XXX parameterize the type of rhs
|
||
|
derived_type &operator*=(const value_type &rhs);
|
||
|
|
||
|
// XXX parameterize the type of rhs
|
||
|
derived_type &operator/=(const value_type &rhs);
|
||
|
|
||
|
// XXX parameterize the type of rhs
|
||
|
derived_type &operator%=(const value_type &rhs);
|
||
|
|
||
|
// XXX parameterize the type of rhs
|
||
|
derived_type &operator<<=(const value_type &rhs);
|
||
|
|
||
|
// XXX parameterize the type of rhs
|
||
|
derived_type &operator>>=(const value_type &rhs);
|
||
|
|
||
|
// XXX parameterize the type of rhs
|
||
|
derived_type &operator&=(const value_type &rhs);
|
||
|
|
||
|
// XXX parameterize the type of rhs
|
||
|
derived_type &operator|=(const value_type &rhs);
|
||
|
|
||
|
// XXX parameterize the type of rhs
|
||
|
derived_type &operator^=(const value_type &rhs);
|
||
|
|
||
|
private:
|
||
|
const pointer m_ptr;
|
||
|
|
||
|
// allow access to m_ptr for other references
|
||
|
template <typename OtherElement, typename OtherPointer, typename OtherDerived> friend class reference;
|
||
|
|
||
|
template<typename System>
|
||
|
__host__ __device__
|
||
|
inline value_type strip_const_get_value(const System &system) const;
|
||
|
|
||
|
template<typename OtherPointer>
|
||
|
__host__ __device__
|
||
|
inline void assign_from(OtherPointer src);
|
||
|
|
||
|
// XXX this helper exists only to avoid warnings about null references from the other assign_from
|
||
|
template<typename System1, typename System2, typename OtherPointer>
|
||
|
inline __host__ __device__
|
||
|
void assign_from(System1 *system1, System2 *system2, OtherPointer src);
|
||
|
|
||
|
template<typename System, typename OtherPointer>
|
||
|
__host__ __device__
|
||
|
inline void strip_const_assign_value(const System &system, OtherPointer src);
|
||
|
|
||
|
// XXX this helper exists only to avoid warnings about null references from the other swap
|
||
|
template<typename System>
|
||
|
inline __host__ __device__
|
||
|
void swap(System *system, derived_type &other);
|
||
|
|
||
|
// XXX this helper exists only to avoid warnings about null references from operator value_type ()
|
||
|
template<typename System>
|
||
|
inline __host__ __device__
|
||
|
value_type convert_to_value_type(System *system) const;
|
||
|
}; // end reference
|
||
|
|
||
|
|
||
|
} // end thrust
|
||
|
|
||
|
#include <thrust/detail/reference.inl>
|
||
|
|