const_pointer.pass.cpp revision c52f43e72dfcea03037729649da84c23b3beb04a
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <memory>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// template <class Alloc>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// struct allocator_traits
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     typedef Alloc::const_pointer
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//           | pointer_traits<pointer>::rebind<const value_type>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     ...
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// };
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <memory>
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <type_traits>
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class T>
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Ptr {};
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class T>
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct A
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef T value_type;
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    typedef Ptr<T> pointer;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
329ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
339ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochtemplate <class T>
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct B
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef T value_type;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class T>
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct CPtr {};
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class T>
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct C
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef T value_type;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef CPtr<T> pointer;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef CPtr<const T> const_pointer;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main()
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static_assert((std::is_same<std::allocator_traits<A<char> >::const_pointer, Ptr<const char> >::value), "");
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static_assert((std::is_same<std::allocator_traits<B<char> >::const_pointer, const char*>::value), "");
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static_assert((std::is_same<std::allocator_traits<C<char> >::const_pointer, CPtr<const char> >::value), "");
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)