11b362b15af34006e6a11974088a46d42b903418eJohann//===----------------------------------------------------------------------===//
21b362b15af34006e6a11974088a46d42b903418eJohann//
31b362b15af34006e6a11974088a46d42b903418eJohann//                     The LLVM Compiler Infrastructure
41b362b15af34006e6a11974088a46d42b903418eJohann//
51b362b15af34006e6a11974088a46d42b903418eJohann// This file is dual licensed under the MIT and the University of Illinois Open
61b362b15af34006e6a11974088a46d42b903418eJohann// Source Licenses. See LICENSE.TXT for details.
71b362b15af34006e6a11974088a46d42b903418eJohann//
81b362b15af34006e6a11974088a46d42b903418eJohann//===----------------------------------------------------------------------===//
91b362b15af34006e6a11974088a46d42b903418eJohann
101b362b15af34006e6a11974088a46d42b903418eJohann// <iterator>
111b362b15af34006e6a11974088a46d42b903418eJohann
121b362b15af34006e6a11974088a46d42b903418eJohann// move_iterator
131b362b15af34006e6a11974088a46d42b903418eJohann
141b362b15af34006e6a11974088a46d42b903418eJohann// template <class U>
151b362b15af34006e6a11974088a46d42b903418eJohann//   requires HasAssign<Iter, const U&>
161b362b15af34006e6a11974088a46d42b903418eJohann//   move_iterator&
171b362b15af34006e6a11974088a46d42b903418eJohann//   operator=(const move_iterator<U>& u);
181b362b15af34006e6a11974088a46d42b903418eJohann
191b362b15af34006e6a11974088a46d42b903418eJohann#include <iterator>
201b362b15af34006e6a11974088a46d42b903418eJohann#include <cassert>
211b362b15af34006e6a11974088a46d42b903418eJohann
221b362b15af34006e6a11974088a46d42b903418eJohann#include "test_iterators.h"
231b362b15af34006e6a11974088a46d42b903418eJohann
241b362b15af34006e6a11974088a46d42b903418eJohanntemplate <class It, class U>
251b362b15af34006e6a11974088a46d42b903418eJohannvoid
261b362b15af34006e6a11974088a46d42b903418eJohanntest(U u)
271b362b15af34006e6a11974088a46d42b903418eJohann{
281b362b15af34006e6a11974088a46d42b903418eJohann    const std::move_iterator<U> r2(u);
291b362b15af34006e6a11974088a46d42b903418eJohann    std::move_iterator<It> r1;
301b362b15af34006e6a11974088a46d42b903418eJohann    std::move_iterator<It>& rr = r1 = r2;
311b362b15af34006e6a11974088a46d42b903418eJohann    assert(r1.base() == u);
321b362b15af34006e6a11974088a46d42b903418eJohann    assert(&rr == &r1);
331b362b15af34006e6a11974088a46d42b903418eJohann}
341b362b15af34006e6a11974088a46d42b903418eJohann
351b362b15af34006e6a11974088a46d42b903418eJohannstruct Base {};
361b362b15af34006e6a11974088a46d42b903418eJohannstruct Derived : Base {};
371b362b15af34006e6a11974088a46d42b903418eJohann
381b362b15af34006e6a11974088a46d42b903418eJohannint main()
391b362b15af34006e6a11974088a46d42b903418eJohann{
401b362b15af34006e6a11974088a46d42b903418eJohann    Derived d;
411b362b15af34006e6a11974088a46d42b903418eJohann
421b362b15af34006e6a11974088a46d42b903418eJohann    test<input_iterator<Base*> >(input_iterator<Derived*>(&d));
431b362b15af34006e6a11974088a46d42b903418eJohann    test<forward_iterator<Base*> >(forward_iterator<Derived*>(&d));
441b362b15af34006e6a11974088a46d42b903418eJohann    test<bidirectional_iterator<Base*> >(bidirectional_iterator<Derived*>(&d));
451b362b15af34006e6a11974088a46d42b903418eJohann    test<random_access_iterator<const Base*> >(random_access_iterator<Derived*>(&d));
461b362b15af34006e6a11974088a46d42b903418eJohann    test<Base*>(&d);
471b362b15af34006e6a11974088a46d42b903418eJohann}
481b362b15af34006e6a11974088a46d42b903418eJohann