// 2005-12-20  Paolo Carlini  <pcarlini@suse.de>

// Copyright (C) 2005 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library.  This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.

// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING.  If not, write to the Free
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.

// 23.3.1 map::swap

#include <map>
#include <testsuite_hooks.h>
#include <testsuite_allocator.h>

// uneq_allocator, two different personalities.
void
test01()
{
  bool test __attribute__((unused)) = true;
  using namespace std;

  typedef pair<const char, int> my_pair;
  typedef __gnu_test::uneq_allocator<my_pair> my_alloc;
  typedef map<char, int, less<char>, my_alloc> my_map;

  const char title01[] = "Rivers of sand";
  const char title02[] = "Concret PH";
  const char title03[] = "Sonatas and Interludes for Prepared Piano";
  const char title04[] = "never as tired as when i'm waking up";

  const size_t N1 = sizeof(title01);
  const size_t N2 = sizeof(title02);
  const size_t N3 = sizeof(title03);
  const size_t N4 = sizeof(title04);

  map<char, int> map01_ref;
  for (size_t i = 0; i < N1; ++i)
    map01_ref.insert(my_pair(title01[i], i));
  map<char, int> map02_ref;
  for (size_t i = 0; i < N2; ++i)
    map02_ref.insert(my_pair(title02[i], i));
  map<char, int> map03_ref;
  for (size_t i = 0; i < N3; ++i)
    map03_ref.insert(my_pair(title03[i], i));
  map<char, int> map04_ref;
  for (size_t i = 0; i < N4; ++i)
    map04_ref.insert(my_pair(title04[i], i));

  my_map::size_type size01, size02;

  my_alloc alloc01(1), alloc02(2);
  int personality01, personality02;

  my_map map01(less<char>(), alloc01);
  size01 = map01.size();
  personality01 = map01.get_allocator().get_personality();
  my_map map02(less<char>(), alloc02);
  size02 = map02.size();
  personality02 = map02.get_allocator().get_personality();

  map01.swap(map02);
  VERIFY( map01.size() == size02 );
  VERIFY( map01.empty() );
  VERIFY( map02.size() == size01 );
  VERIFY( map02.empty() );
  VERIFY( map01.get_allocator().get_personality() == personality02 );
  VERIFY( map02.get_allocator().get_personality() == personality01 );

  my_map map03(less<char>(), alloc02);
  size01 = map03.size();
  personality01 = map03.get_allocator().get_personality();
  my_map map04(map02_ref.begin(), map02_ref.end(), less<char>(), alloc01);
  size02 = map04.size();
  personality02 = map04.get_allocator().get_personality();

  map03.swap(map04);
  VERIFY( map03.size() == size02 );
  VERIFY( equal(map03.begin(), map03.end(), map02_ref.begin()) );
  VERIFY( map04.size() == size01 );
  VERIFY( map04.empty() );
  VERIFY( map03.get_allocator().get_personality() == personality02 );
  VERIFY( map04.get_allocator().get_personality() == personality01 );
  
  my_map map05(map01_ref.begin(), map01_ref.end(), less<char>(), alloc01);
  size01 = map05.size();
  personality01 = map05.get_allocator().get_personality();
  my_map map06(map02_ref.begin(), map02_ref.end(), less<char>(), alloc02);
  size02 = map06.size();
  personality02 = map06.get_allocator().get_personality();

  map05.swap(map06);
  VERIFY( map05.size() == size02 );
  VERIFY( equal(map05.begin(), map05.end(), map02_ref.begin()) );
  VERIFY( map06.size() == size01 );
  VERIFY( equal(map06.begin(), map06.end(), map01_ref.begin()) );
  VERIFY( map05.get_allocator().get_personality() == personality02 );
  VERIFY( map06.get_allocator().get_personality() == personality01 );

  my_map map07(map01_ref.begin(), map01_ref.end(), less<char>(), alloc02);
  size01 = map07.size();
  personality01 = map07.get_allocator().get_personality();
  my_map map08(map03_ref.begin(), map03_ref.end(), less<char>(), alloc01);
  size02 = map08.size();
  personality02 = map08.get_allocator().get_personality();

  map07.swap(map08);
  VERIFY( map07.size() == size02 );
  VERIFY( equal(map07.begin(), map07.end(), map03_ref.begin()) );
  VERIFY( map08.size() == size01 );
  VERIFY( equal(map08.begin(), map08.end(), map01_ref.begin()) );
  VERIFY( map07.get_allocator().get_personality() == personality02 );
  VERIFY( map08.get_allocator().get_personality() == personality01 );

  my_map map09(map03_ref.begin(), map03_ref.end(), less<char>(), alloc01);
  size01 = map09.size();
  personality01 = map09.get_allocator().get_personality();
  my_map map10(map04_ref.begin(), map04_ref.end(), less<char>(), alloc02);
  size02 = map10.size();
  personality02 = map10.get_allocator().get_personality();

  map09.swap(map10);
  VERIFY( map09.size() == size02 );
  VERIFY( equal(map09.begin(), map09.end(), map04_ref.begin()) );
  VERIFY( map10.size() == size01 );
  VERIFY( equal(map10.begin(), map10.end(), map03_ref.begin()) );
  VERIFY( map09.get_allocator().get_personality() == personality02 );
  VERIFY( map10.get_allocator().get_personality() == personality01 );

  my_map map11(map04_ref.begin(), map04_ref.end(), less<char>(), alloc02);
  size01 = map11.size();
  personality01 = map11.get_allocator().get_personality();
  my_map map12(map01_ref.begin(), map01_ref.end(), less<char>(), alloc01);
  size02 = map12.size();
  personality02 = map12.get_allocator().get_personality();

  map11.swap(map12);
  VERIFY( map11.size() == size02 );
  VERIFY( equal(map11.begin(), map11.end(), map01_ref.begin()) );
  VERIFY( map12.size() == size01 );
  VERIFY( equal(map12.begin(), map12.end(), map04_ref.begin()) );
  VERIFY( map11.get_allocator().get_personality() == personality02 );
  VERIFY( map12.get_allocator().get_personality() == personality01 );

  my_map map13(map03_ref.begin(), map03_ref.end(), less<char>(), alloc01);
  size01 = map13.size();
  personality01 = map13.get_allocator().get_personality();
  my_map map14(map03_ref.begin(), map03_ref.end(), less<char>(), alloc02);
  size02 = map14.size();
  personality02 = map14.get_allocator().get_personality();

  map13.swap(map14);
  VERIFY( map13.size() == size02 );
  VERIFY( equal(map13.begin(), map13.end(), map03_ref.begin()) );
  VERIFY( map14.size() == size01 );
  VERIFY( equal(map14.begin(), map14.end(), map03_ref.begin()) );
  VERIFY( map13.get_allocator().get_personality() == personality02 );
  VERIFY( map14.get_allocator().get_personality() == personality01 );
}

int main()
{ 
  test01();
  return 0;
}
