(root)/
gcc-13.2.0/
libstdc++-v3/
testsuite/
23_containers/
vector/
modifiers/
emplace/
1.cc
// { dg-do run { target c++11 } }

#include <vector>
#include <testsuite_hooks.h>

void
test01()
{
  std::vector<int> c;
  std::vector<int>::iterator pos;

  // libstdc++/52799
  pos = c.emplace(c.begin());
  VERIFY( c.size() == 1 );
  VERIFY( c[0] == 0 );
  VERIFY( pos == c.begin() );
  pos = c.emplace(c.begin(), 2);
  VERIFY( c.size() == 2 );
  VERIFY( c[0] == 2 );
  VERIFY( c[1] == 0 );
  VERIFY( pos == c.begin() );
  pos = c.emplace(c.end(), 3);
  VERIFY( c.size() == 3 );
  VERIFY( c[0] == 2 );
  VERIFY( c[1] == 0 );
  VERIFY( c[2] == 3 );
  VERIFY( pos == --c.end() );

  // const_iterator
  pos = c.emplace(c.cbegin());
  VERIFY( c.size() == 4 );
  VERIFY( c[0] == 0 );
  VERIFY( c[1] == 2 );
  VERIFY( pos == c.cbegin() );
  pos = c.emplace(c.cbegin() + 2, 22);
  VERIFY( c.size() == 5 );
  VERIFY( c[0] == 0 );
  VERIFY( c[1] == 2 );
  VERIFY( c[2] == 22 );
  VERIFY( pos == c.cbegin() + 2 );
}

struct V
{
  explicit V(int a, int b = 0) : val(a+b) { }
  int val;
};

void
test02()
{
  std::vector<V> c;
  std::vector<V>::iterator pos;

  pos = c.emplace(c.end(), 1);
  VERIFY( c.size() == 1 );
  VERIFY( c[0].val == 1 );
  VERIFY( pos == --c.end() );
  pos = c.emplace(c.cend(), 2, 3);
  VERIFY( c.size() == 2 );
  VERIFY( c[0].val == 1 );
  VERIFY( c[1].val == 5 );
  VERIFY( pos == --c.cend() );
}

int main()
{
  test01();
  test02();
}