111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===//
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//                     The LLVM Compiler Infrastructure
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is dual licensed under the MIT and the University of Illinois Open
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Source Licenses. See LICENSE.TXT for details.
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===//
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <iterator>
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// insert_iterator
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// requires CopyConstructible<Cont::value_type>
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//   insert_iterator<Cont>&
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//   operator=(const Cont::value_type& value);
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <iterator>
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <vector>
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <cassert>
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "nasty_containers.hpp"
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class C>
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttest(C c1, typename C::difference_type j,
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     typename C::value_type x1, typename C::value_type x2,
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     typename C::value_type x3, const C& c2)
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    std::insert_iterator<C> q(c1, c1.begin() + j);
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    q = x1;
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    q = x2;
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    q = x3;
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(c1 == c2);
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class C>
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinsert3at(C& c, typename C::iterator i,
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     typename C::value_type x1, typename C::value_type x2,
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     typename C::value_type x3)
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    i = c.insert(i, x1);
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    i = c.insert(++i, x2);
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    c.insert(++i, x3);
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint main()
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef std::vector<int> C;
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    C c1;
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    for (int i = 0; i < 3; ++i)
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        c1.push_back(i);
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    C c2 = c1;
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    insert3at(c2, c2.begin(), 'a', 'b', 'c');
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test(c1, 0, 'a', 'b', 'c', c2);
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    c2 = c1;
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    insert3at(c2, c2.begin()+1, 'a', 'b', 'c');
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test(c1, 1, 'a', 'b', 'c', c2);
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    c2 = c1;
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    insert3at(c2, c2.begin()+2, 'a', 'b', 'c');
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test(c1, 2, 'a', 'b', 'c', c2);
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    c2 = c1;
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    insert3at(c2, c2.begin()+3, 'a', 'b', 'c');
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test(c1, 3, 'a', 'b', 'c', c2);
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef nasty_vector<int> C;
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    C c1;
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    for (int i = 0; i < 3; ++i)
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        c1.push_back(i);
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    C c2 = c1;
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    insert3at(c2, c2.begin(), 'a', 'b', 'c');
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test(c1, 0, 'a', 'b', 'c', c2);
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    c2 = c1;
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    insert3at(c2, c2.begin()+1, 'a', 'b', 'c');
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test(c1, 1, 'a', 'b', 'c', c2);
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    c2 = c1;
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    insert3at(c2, c2.begin()+2, 'a', 'b', 'c');
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test(c1, 2, 'a', 'b', 'c', c2);
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    c2 = c1;
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    insert3at(c2, c2.begin()+3, 'a', 'b', 'c');
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test(c1, 3, 'a', 'b', 'c', c2);
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
86