// 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.

// 6.3.4.3 unordered_set::swap

#include <tr1/unordered_set>
#include <set>
#include <testsuite_hooks.h>
#include <testsuite_allocator.h>

// uneq_allocator as a non-empty allocator.
void
test01()
{
  bool test __attribute__((unused)) = true;
  using namespace std;
  using namespace tr1;

  typedef __gnu_test::uneq_allocator<char> my_alloc;
  typedef unordered_set<char, hash<char>, equal_to<char>, my_alloc> my_uset;

  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);

  typedef set<char> my_set;
  const my_set set01_ref(title01, title01 + N1);
  const my_set set02_ref(title02, title02 + N2);
  const my_set set03_ref(title03, title03 + N3);
  const my_set set04_ref(title04, title04 + N4);

  my_uset::size_type size01, size02;

  my_alloc alloc01(1);

  my_uset uset01(10, hash<char>(), equal_to<char>(), alloc01);
  size01 = uset01.size();
  my_uset uset02(10, hash<char>(), equal_to<char>(), alloc01);
  size02 = uset02.size();
  
  uset01.swap(uset02);
  VERIFY( uset01.size() == size02 );
  VERIFY( uset01.empty() );
  VERIFY( uset02.size() == size01 );
  VERIFY( uset02.empty() );

  my_uset uset03(10, hash<char>(), equal_to<char>(), alloc01);
  size01 = uset03.size();
  my_uset uset04(set02_ref.begin(), set02_ref.end(), 10, hash<char>(),
		 equal_to<char>(), alloc01);
  size02 = uset04.size();
  
  uset03.swap(uset04);
  VERIFY( uset03.size() == size02 );
  VERIFY( my_set(uset03.begin(), uset03.end()) == set02_ref );
  VERIFY( uset04.size() == size01 );
  VERIFY( uset04.empty() );
  
  my_uset uset05(set01_ref.begin(), set01_ref.end(), 10, hash<char>(),
		 equal_to<char>(), alloc01);
  size01 = uset05.size();
  my_uset uset06(set02_ref.begin(), set02_ref.end(), 10, hash<char>(),
		 equal_to<char>(), alloc01);
  size02 = uset06.size();
  
  uset05.swap(uset06);
  VERIFY( uset05.size() == size02 );
  VERIFY( my_set(uset05.begin(), uset05.end()) == set02_ref );
  VERIFY( uset06.size() == size01 );
  VERIFY( my_set(uset06.begin(), uset06.end()) == set01_ref );

  my_uset uset07(set01_ref.begin(), set01_ref.end(), 10, hash<char>(),
		 equal_to<char>(), alloc01);
  size01 = uset07.size();
  my_uset uset08(set03_ref.begin(), set03_ref.end(), 10, hash<char>(),
		 equal_to<char>(), alloc01);
  size02 = uset08.size();

  uset07.swap(uset08);
  VERIFY( uset07.size() == size02 );
  VERIFY( my_set(uset07.begin(), uset07.end()) == set03_ref );
  VERIFY( uset08.size() == size01 );
  VERIFY( my_set(uset08.begin(), uset08.end()) == set01_ref );

  my_uset uset09(set03_ref.begin(), set03_ref.end(), 10, hash<char>(),
		 equal_to<char>(), alloc01);
  size01 = uset09.size();
  my_uset uset10(set04_ref.begin(), set04_ref.end(), 10, hash<char>(),
		 equal_to<char>(), alloc01);
  size02 = uset10.size();

  uset09.swap(uset10);
  VERIFY( uset09.size() == size02 );
  VERIFY( my_set(uset09.begin(), uset09.end()) == set04_ref );
  VERIFY( uset10.size() == size01 );
  VERIFY( my_set(uset10.begin(), uset10.end()) == set03_ref );

  my_uset uset11(set04_ref.begin(), set04_ref.end(), 10, hash<char>(),
		 equal_to<char>(), alloc01);
  size01 = uset11.size();
  my_uset uset12(set01_ref.begin(), set01_ref.end(), 10, hash<char>(),
		 equal_to<char>(), alloc01);
  size02 = uset12.size();

  uset11.swap(uset12);
  VERIFY( uset11.size() == size02 );
  VERIFY( my_set(uset11.begin(), uset11.end()) == set01_ref );
  VERIFY( uset12.size() == size01 );
  VERIFY( my_set(uset12.begin(), uset12.end()) == set04_ref );

  my_uset uset13(set03_ref.begin(), set03_ref.end(), 10, hash<char>(),
		 equal_to<char>(), alloc01);
  size01 = uset13.size();
  my_uset uset14(set03_ref.begin(), set03_ref.end(), 10, hash<char>(),
		 equal_to<char>(), alloc01);
  size02 = uset14.size();

  uset13.swap(uset14);
  VERIFY( uset13.size() == size02 );
  VERIFY( my_set(uset13.begin(), uset13.end()) == set03_ref );
  VERIFY( uset14.size() == size01 );
  VERIFY( my_set(uset14.begin(), uset14.end()) == set03_ref );
}

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