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

// Copyright (C) 2005, 2006 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.2.5 vector<bool>::swap

#include <vector>
#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;

  typedef __gnu_test::uneq_allocator<bool> my_alloc;
  typedef vector<bool, my_alloc> my_vector;

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

  vector<bool> vec01_ref;
  for (size_t i = 0; i < N1; ++i)
    vec01_ref.push_back(bool(title01[i] > 96 ? 1 : 0));
  vector<bool> vec02_ref;
  for (size_t i = 0; i < N2; ++i)
    vec02_ref.push_back(bool(title02[i] > 96 ? 1 : 0));
  vector<bool> vec03_ref;
  for (size_t i = 0; i < N3; ++i)
    vec03_ref.push_back(bool(title03[i] > 96 ? 1 : 0));
  vector<bool> vec04_ref;
  for (size_t i = 0; i < N4; ++i)
    vec04_ref.push_back(bool(title04[i] > 96 ? 1 : 0));

  my_vector::size_type size01, size02;

  my_alloc alloc01(1);

  my_vector vec01(alloc01);
  size01 = vec01.size();
  my_vector vec02(alloc01);
  size02 = vec02.size();
  
  vec01.swap(vec02);
  VERIFY( vec01.size() == size02 );
  VERIFY( vec01.empty() );
  VERIFY( vec02.size() == size01 );
  VERIFY( vec02.empty() );

  my_vector vec03(alloc01);
  size01 = vec03.size();
  my_vector vec04(vec02_ref.begin(), vec02_ref.end(), alloc01);
  size02 = vec04.size();
  
  vec03.swap(vec04);
  VERIFY( vec03.size() == size02 );
  VERIFY( equal(vec03.begin(), vec03.end(), vec02_ref.begin()) );
  VERIFY( vec04.size() == size01 );
  VERIFY( vec04.empty() );
  
  my_vector vec05(vec01_ref.begin(), vec01_ref.end(), alloc01);
  size01 = vec05.size();
  my_vector vec06(vec02_ref.begin(), vec02_ref.end(), alloc01);
  size02 = vec06.size();
  
  vec05.swap(vec06);
  VERIFY( vec05.size() == size02 );
  VERIFY( equal(vec05.begin(), vec05.end(), vec02_ref.begin()) );
  VERIFY( vec06.size() == size01 );
  VERIFY( equal(vec06.begin(), vec06.end(), vec01_ref.begin()) );

  my_vector vec07(vec01_ref.begin(), vec01_ref.end(), alloc01);
  size01 = vec07.size();
  my_vector vec08(vec03_ref.begin(), vec03_ref.end(), alloc01);
  size02 = vec08.size();

  vec07.swap(vec08);
  VERIFY( vec07.size() == size02 );
  VERIFY( equal(vec07.begin(), vec07.end(), vec03_ref.begin()) );
  VERIFY( vec08.size() == size01 );
  VERIFY( equal(vec08.begin(), vec08.end(), vec01_ref.begin()) );

  my_vector vec09(vec03_ref.begin(), vec03_ref.end(), alloc01);
  size01 = vec09.size();
  my_vector vec10(vec04_ref.begin(), vec04_ref.end(), alloc01);
  size02 = vec10.size();

  vec09.swap(vec10);
  VERIFY( vec09.size() == size02 );
  VERIFY( equal(vec09.begin(), vec09.end(), vec04_ref.begin()) );
  VERIFY( vec10.size() == size01 );
  VERIFY( equal(vec10.begin(), vec10.end(), vec03_ref.begin()) );

  my_vector vec11(vec04_ref.begin(), vec04_ref.end(), alloc01);
  size01 = vec11.size();
  my_vector vec12(vec01_ref.begin(), vec01_ref.end(), alloc01);
  size02 = vec12.size();

  vec11.swap(vec12);
  VERIFY( vec11.size() == size02 );
  VERIFY( equal(vec11.begin(), vec11.end(), vec01_ref.begin()) );
  VERIFY( vec12.size() == size01 );
  VERIFY( equal(vec12.begin(), vec12.end(), vec04_ref.begin()) );

  my_vector vec13(vec03_ref.begin(), vec03_ref.end(), alloc01);
  size01 = vec13.size();
  my_vector vec14(vec03_ref.begin(), vec03_ref.end(), alloc01);
  size02 = vec14.size();

  vec13.swap(vec14);
  VERIFY( vec13.size() == size02 );
  VERIFY( equal(vec13.begin(), vec13.end(), vec03_ref.begin()) );
  VERIFY( vec14.size() == size01 );
  VERIFY( equal(vec14.begin(), vec14.end(), vec03_ref.begin()) );
}

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