blob: 6cce5385054f9f4da02ee9727715a3a54bc8d6fb [file] [log] [blame]
// -*- C++ -*-
//
// Copyright (C) 2012-2022 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 3, 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 COPYING3. If not see
// <http://www.gnu.org/licenses/>.
//
#ifndef _TESTSUITE_COUNTER_TYPE_H
#define _TESTSUITE_COUNTER_TYPE_H 1
namespace __gnu_test
{
// Type counting how many constructors or assign operators are invoked.
struct counter_type
{
// Constructor counters:
static int default_count;
static int specialize_count;
static int copy_count;
static int copy_assign_count;
static int less_compare_count;
#if __cplusplus >= 201103L
static int move_count;
static int move_assign_count;
#endif
static int destructor_count;
int val;
counter_type() : val(0)
{ ++default_count; }
counter_type(int inval) : val(inval)
{ ++specialize_count; }
counter_type(const counter_type& in) : val(in.val)
{ ++copy_count; }
~counter_type()
{ ++destructor_count; }
counter_type&
operator=(const counter_type& in)
{
val = in.val;
++copy_assign_count;
return *this;
}
#if __cplusplus >= 201103L
counter_type(counter_type&& in) noexcept
{
val = in.val;
++move_count;
}
counter_type&
operator=(counter_type&& rhs) noexcept
{
val = rhs.val;
++move_assign_count;
return *this;
}
#endif
static void
reset()
{
default_count = 0;
specialize_count = 0;
copy_count = 0;
copy_assign_count = 0;
less_compare_count = 0;
#if __cplusplus >= 201103L
move_count = 0;
move_assign_count = 0;
#endif
destructor_count = 0;
}
bool operator==(const counter_type& rhs) const
{ return val == rhs.val; }
bool operator<(const counter_type& rhs) const
{
++less_compare_count;
return val < rhs.val;
}
};
int counter_type::default_count = 0;
int counter_type::specialize_count = 0;
int counter_type::copy_count = 0;
int counter_type::copy_assign_count = 0;
int counter_type::less_compare_count = 0;
#if __cplusplus >= 201103L
int counter_type::move_count = 0;
int counter_type::move_assign_count = 0;
#endif
int counter_type::destructor_count = 0;
struct counter_type_hasher
{
std::size_t operator()(const counter_type& c) const
{
return c.val;
}
};
} // namespace __gnu_test
#endif