// -*- C++ -*-
// Testing utilities for the tr1 testsuite.
//
// Copyright (C) 2004-2021 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 _GLIBCXX_TESTSUITE_TR1_H
#define _GLIBCXX_TESTSUITE_TR1_H

#include <ext/type_traits.h>
#include <testsuite_hooks.h>

namespace __gnu_test
{
  // For tr1/type_traits.
  template<template<typename> class Category, typename Type>
#if __cplusplus >= 201103L
    constexpr
#endif
    bool
    test_category(bool value)
    {
      return (Category<Type>::value == value
	      && Category<const Type>::value == value
	      && Category<volatile Type>::value == value
	      && Category<const volatile Type>::value == value
	      && Category<Type>::type::value == value
	      && Category<const Type>::type::value == value
	      && Category<volatile Type>::type::value == value
	      && Category<const volatile Type>::type::value == value);
    }

  // For testing tr1/type_traits/extent, which has a second template
  // parameter.
  template<template<typename, unsigned> class Property,
	   typename Type, unsigned Uint>
#if __cplusplus >= 201103L
    constexpr
#endif
    bool
    test_property(typename Property<Type, Uint>::value_type value)
    {
      return (Property<Type, Uint>::value == value
	      && Property<Type, Uint>::type::value == value);
    }

#if __cplusplus >= 201103L
  template<template<typename...> class Property,
	   typename Type1, typename... Types>
    constexpr bool
    test_property(typename Property<Type1, Types...>::value_type value)
    {
      return (Property<Type1, Types...>::value == value
	      && Property<Type1, Types...>::type::value == value);
    }
#else
  template<template<typename> class Property, typename Type>
    bool
    test_property(typename Property<Type>::value_type value)
    {
      return (Property<Type>::value == value
	      && Property<Type>::type::value == value);
    }
#endif

  template<template<typename, typename> class Relationship,
	   typename Type1, typename Type2>
#if __cplusplus >= 201103L
    constexpr
#endif
    bool
    test_relationship(bool value)
    {
      return (Relationship<Type1, Type2>::value == value
	      && Relationship<Type1, Type2>::type::value == value);
    }

  // Test types.
  class ClassType { };
  typedef const ClassType           cClassType;
  typedef volatile ClassType        vClassType;
  typedef const volatile ClassType  cvClassType;

  class DerivedType : public ClassType { };

#if __cplusplus >= 201103L
  class FinalType final : public DerivedType { };
#endif

  enum EnumType { e0 };

  struct ConvType
  { operator int() const; };

  class AbstractClass
  {
    virtual void rotate(int) = 0;
  };

  class PolymorphicClass
  {
    virtual void rotate(int);
  };

  class DerivedPolymorphic : public PolymorphicClass { };

  class VirtualDestructorClass
  {
    virtual ~VirtualDestructorClass();
  };

  union UnionType { };

  union IncompleteUnion;

  class IncompleteClass;

  struct ExplicitClass
  {
    ExplicitClass(double&);
    explicit ExplicitClass(int&);
    ExplicitClass(double&, int&, double&);
  };

  struct NothrowExplicitClass
  {
    NothrowExplicitClass(double&) throw();
    explicit NothrowExplicitClass(int&) throw();
    NothrowExplicitClass(double&, int&, double&) throw();
  };

  struct ThrowExplicitClass
  {
    ThrowExplicitClass(double&) THROW(int);
    explicit ThrowExplicitClass(int&) THROW(int);
    ThrowExplicitClass(double&, int&, double&) THROW(int);
  };

  struct ThrowDefaultClass
  {
    ThrowDefaultClass() THROW(int);
  };

  struct ThrowCopyConsClass
  {
    ThrowCopyConsClass(const ThrowCopyConsClass&) THROW(int);
  };

#if __cplusplus >= 201103L
  struct ThrowMoveConsClass
  {
    ThrowMoveConsClass(ThrowMoveConsClass&&) noexcept(false);
  };

  struct NoexceptExplicitClass
  {
    NoexceptExplicitClass(double&) noexcept(true);
    explicit NoexceptExplicitClass(int&) noexcept(true);
    NoexceptExplicitClass(double&, int&, double&) noexcept(true);
  };

  struct ExceptExplicitClass
  {
    ExceptExplicitClass(double&) noexcept(false);
    explicit ExceptExplicitClass(int&) noexcept(false);
    ExceptExplicitClass(double&, int&, double&) noexcept(false);
  };

  struct NoexceptDefaultClass
  {
    NoexceptDefaultClass() noexcept(true);
  };

  struct ExceptDefaultClass
  {
    ExceptDefaultClass() noexcept(false);
  };

  struct NoexceptCopyConsClass
  {
    NoexceptCopyConsClass(const NoexceptCopyConsClass&) noexcept(true);
  };

  struct ExceptCopyConsClass
  {
    ExceptCopyConsClass(const ExceptCopyConsClass&) noexcept(false);
  };

  struct NoexceptMoveConsClass
  {
    NoexceptMoveConsClass(NoexceptMoveConsClass&&) noexcept(true);
    NoexceptMoveConsClass& operator=(NoexceptMoveConsClass&&) = default;
  };

  struct ExceptMoveConsClass
  {
    ExceptMoveConsClass(ExceptMoveConsClass&&) noexcept(false);
  };

  struct NoexceptCopyAssignClass
  {
    NoexceptCopyAssignClass&
    operator=(const NoexceptCopyAssignClass&) noexcept(true);
  };

  struct ExceptCopyAssignClass
  {
    ExceptCopyAssignClass&
    operator=(const ExceptCopyAssignClass&) noexcept(false);
  };

  struct NoexceptMoveAssignClass
  {
    NoexceptMoveAssignClass(NoexceptMoveAssignClass&&) = default;
    NoexceptMoveAssignClass&
    operator=(NoexceptMoveAssignClass&&) noexcept(true);
  };

  struct ExceptMoveAssignClass
  {
    ExceptMoveAssignClass&
    operator=(ExceptMoveAssignClass&&) noexcept(false);
  };

  struct DeletedCopyAssignClass
  {
    DeletedCopyAssignClass&
    operator=(const DeletedCopyAssignClass&) = delete;
  };

  struct DeletedMoveAssignClass
  {
    DeletedMoveAssignClass&
    operator=(DeletedMoveAssignClass&&) = delete;
  };

  struct NoexceptMoveConsNoexceptMoveAssignClass
  {
    NoexceptMoveConsNoexceptMoveAssignClass
    (NoexceptMoveConsNoexceptMoveAssignClass&&) noexcept(true);

    NoexceptMoveConsNoexceptMoveAssignClass&
    operator=(NoexceptMoveConsNoexceptMoveAssignClass&&) noexcept(true);
  };

  struct ExceptMoveConsNoexceptMoveAssignClass
  {
    ExceptMoveConsNoexceptMoveAssignClass
    (ExceptMoveConsNoexceptMoveAssignClass&&) noexcept(false);

    ExceptMoveConsNoexceptMoveAssignClass&
    operator=(ExceptMoveConsNoexceptMoveAssignClass&&) noexcept(true);
  };

  struct NoexceptMoveConsExceptMoveAssignClass
  {
    NoexceptMoveConsExceptMoveAssignClass
    (NoexceptMoveConsExceptMoveAssignClass&&) noexcept(true);

    NoexceptMoveConsExceptMoveAssignClass&
    operator=(NoexceptMoveConsExceptMoveAssignClass&&) noexcept(false);
  };

  struct ExceptMoveConsExceptMoveAssignClass
  {
    ExceptMoveConsExceptMoveAssignClass
    (ExceptMoveConsExceptMoveAssignClass&&) noexcept(false);

    ExceptMoveConsExceptMoveAssignClass&
    operator=(ExceptMoveConsExceptMoveAssignClass&&) noexcept(false);
  };
#endif

  struct NType   // neither trivial nor standard-layout
  {
    int i;
    int j;
    virtual ~NType();
  };

  struct TType   // trivial but not standard-layout
  {
    int i;
  private:
    int j;
  };

  struct SLType  // standard-layout but not trivial
  {
    int i;
    int j;
    ~SLType();
  };

  struct PODType // both trivial and standard-layout
  {
    int i;
    int j;
  };

#if __cplusplus >= 201103L
  struct LType // literal type
  {
    int _M_i;

    constexpr LType(int __i) : _M_i(__i) { }
  };

  struct LTypeDerived : public LType
  {
    constexpr LTypeDerived(int __i) : LType(__i) { }
  };

  struct NLType // not literal type
  {
    int _M_i;

    NLType() : _M_i(0) { }

    constexpr NLType(int __i) : _M_i(__i) { }

    NLType(const NLType& __other) : _M_i(__other._M_i) { }

    ~NLType() { _M_i = 0; }
  };
#endif

  int truncate_float(float x) { return (int)x; }
  long truncate_double(double x) { return (long)x; }

  struct do_truncate_float_t
  {
    do_truncate_float_t()
    {
      ++live_objects;
    }

    do_truncate_float_t(const do_truncate_float_t&)
    {
      ++live_objects;
    }

    ~do_truncate_float_t()
    {
      --live_objects;
    }

    int operator()(float x) { return (int)x; }

    static int live_objects;
  };

  int do_truncate_float_t::live_objects = 0;

  struct do_truncate_double_t
  {
    do_truncate_double_t()
    {
     ++live_objects;
    }

    do_truncate_double_t(const do_truncate_double_t&)
    {
      ++live_objects;
    }

    ~do_truncate_double_t()
    {
      --live_objects;
    }

    long operator()(double x) { return (long)x; }

    static int live_objects;
  };

  int do_truncate_double_t::live_objects = 0;

  struct X
  {
    int bar;

    int foo()                   { return 1; }
    int foo_c() const           { return 2; }
    int foo_v()  volatile       { return 3; }
    int foo_cv() const volatile { return 4; }
  };

  // For use in 8_c_compatibility.
  template<typename R, typename T>
    typename __gnu_cxx::__enable_if<std::__are_same<R, T>::__value,
				    bool>::__type
    check_ret_type(T)
    { return true; }

#if __cplusplus >= 201103L
  namespace construct
  {
    struct Empty {};

    struct B { int i; B(){} };
    struct D : B {};

    enum E { ee1 };
    enum E2 { ee2 };
    enum class SE { e1 };
    enum class SE2 { e2 };

    enum OpE : int;
    enum class OpSE : bool;

    union U { int i; Empty b; };

    struct Abstract
    {
      virtual ~Abstract() = 0;
    };

    struct AbstractDelDtor
    {
      ~AbstractDelDtor() = delete;
      virtual void foo() = 0;
    };

    struct Ukn;

    template<class To>
      struct ImplicitTo
      {
	operator To();
      };

    template<class To>
      struct DelImplicitTo
      {
	operator To() = delete;
      };

    template<class To>
      struct ExplicitTo
      {
	explicit operator To();
      };

    struct Ellipsis
    {
      Ellipsis(...){}
    };

    struct DelEllipsis
    {
      DelEllipsis(...) = delete;
    };

    struct Any
    {
      template<class T>
      Any(T&&){}
    };

    struct nAny
    {
      template<class... T>
      nAny(T&&...){}
    };

    struct DelnAny
    {
      template<class... T>
        DelnAny(T&&...) = delete;
    };

    template<class... Args>
      struct FromArgs
      {
	FromArgs(Args...);
      };

    struct DelDef
    {
      DelDef() = delete;
    };

    struct DelCopy
    {
      DelCopy(const DelCopy&) = delete;
    };

    struct DelDtor
    {
      DelDtor() = default;
      DelDtor(const DelDtor&) = default;
      DelDtor(DelDtor&&) = default;
      DelDtor(int);
      DelDtor(int, B, U);
      ~DelDtor() = delete;
    };

    struct Nontrivial
    {
      Nontrivial();
      Nontrivial(const Nontrivial&);
      Nontrivial& operator=(const Nontrivial&);
      ~Nontrivial();
    };

    union NontrivialUnion
    {
      int i;
      Nontrivial n;
    };

    struct UnusualCopy
    {
      UnusualCopy(UnusualCopy&);
    };
  }

  namespace destruct
  {
    struct E
    {};

    struct NTD1
    {
      ~NTD1() = default;
    };

    struct NTD2
    {
      ~NTD2();
    };

    struct NTD3
    {
      ~NTD3() throw();
    };

    struct TD1
    {
      ~TD1() noexcept(false);
    };

    struct TD2
    {
      ~TD2() THROW(int);
    };

    struct Aggr
    {
      int i;
      bool b;
      E e;
    };

    struct Aggr2
    {
      int i;
      bool b;
      TD1 r;
    };

    struct Del
    {
      ~Del() = delete;
    };

    struct Del2
    {
      ~Del2() noexcept = delete;
    };

    struct Del3
    {
      ~Del3() noexcept(false) = delete;
    };

    struct Der : Aggr
    {};

    struct Der2 : Aggr2
    {};

    union U1
    {
      int i;
      double d;
      void* p;
      TD1* pt;
    };

    union Ut
    {
      int i;
      double d;
      void* p;
      TD1 pt;
    };

    enum class En { a, b, c, d };
    enum En2 { En2a, En2b, En2c, En2d };

    enum OpE : int;
    enum class OpSE : bool;

    struct Abstract1
    {
      virtual ~Abstract1() = 0;
    };

    struct AbstractDelDtor
    {
      ~AbstractDelDtor() = delete;
      virtual void foo() = 0;
    };

    struct Abstract2
    {
      virtual ~Abstract2() noexcept(false) = 0;
    };

    struct Abstract3
    {
      ~Abstract3() noexcept(false);
      virtual void foo() noexcept = 0;
    };

    struct Nontrivial
    {
      Nontrivial();
      Nontrivial(const Nontrivial&);
      Nontrivial& operator=(const Nontrivial&);
      ~Nontrivial();
    };

    union NontrivialUnion
    {
      int i;
      Nontrivial n;
    };

    struct UnusualCopy
    {
      UnusualCopy(UnusualCopy&);
    };

    struct Ellipsis
    {
      Ellipsis(...){}
    };

    struct DelEllipsis
    {
      DelEllipsis(...) = delete;
    };

    struct DelDef
    {
      DelDef() = delete;
    };

    struct DelCopy
    {
      DelCopy(const DelCopy&) = delete;
    };
  }

  namespace assign
  {
    struct Empty {};

    struct B { int i; B(){} };
    struct D : B {};

    enum E { ee1 };
    enum E2 { ee2 };
    enum class SE { e1 };
    enum class SE2 { e2 };

    enum OpE : int;
    enum class OpSE : bool;

    union U { int i; Empty b; };

    union UAssignAll
    {
      bool b;
      char c;
      template<class T>
      void operator=(T&&);
    };

    union UDelAssignAll
    {
      bool b;
      char c;
      template<class T>
      void operator=(T&&) = delete;
    };

    struct Abstract
    {
      virtual ~Abstract() = 0;
    };

    struct AbstractDelDtor
    {
      ~AbstractDelDtor() = delete;
      virtual void foo() = 0;
    };

    struct Ukn;

    template<class To>
      struct ImplicitTo
      {
	operator To();
      };

    template<class To>
      struct ExplicitTo
      {
	explicit operator To();
      };

    template<class To>
      struct DelImplicitTo
      {
	operator To() = delete;
      };

    template<class To>
      struct DelExplicitTo
      {
	explicit operator To() = delete;
      };

    struct Ellipsis
    {
      Ellipsis(...){}
    };

    struct DelEllipsis
    {
      DelEllipsis(...) = delete;
    };

    struct Any
    {
      template<class T>
        Any(T&&){}
    };

    struct nAny
    {
      template<class... T>
        nAny(T&&...){}
    };

    struct DelnAny
    {
      template<class... T>
        DelnAny(T&&...) = delete;
    };

    template<class... Args>
      struct FromArgs
      {
	FromArgs(Args...);
      };

    template<class... Args>
      struct DelFromArgs
      {
	DelFromArgs(Args...) = delete;
      };

    struct DelDef
    {
      DelDef() = delete;
    };

    struct DelCopy
    {
      DelCopy(const DelCopy&) = delete;
    };

    struct DelDtor
    {
      DelDtor() = default;
      DelDtor(const DelDtor&) = default;
      DelDtor(DelDtor&&) = default;
      DelDtor(int);
      DelDtor(int, B, U);
      ~DelDtor() = delete;
    };

    struct Nontrivial
    {
      Nontrivial();
      Nontrivial(const Nontrivial&);
      Nontrivial& operator=(const Nontrivial&);
      ~Nontrivial();
    };

    union NontrivialUnion
    {
      int i;
      Nontrivial n;
    };

    struct UnusualCopy
    {
      UnusualCopy(UnusualCopy&);
    };

    struct AnyAssign
    {
      template<class T>
        void operator=(T&&);
    };

    struct DelAnyAssign
    {
      template<class T>
        void operator=(T&&) = delete;
    };

    struct DelCopyAssign
    {
      DelCopyAssign& operator=(const DelCopyAssign&) = delete;
      DelCopyAssign& operator=(DelCopyAssign&&) = default;
    };

    struct MO
    {
      MO(MO&&) = default;
      MO& operator=(MO&&) = default;
    };
  }

  struct CopyConsOnlyType
  {
    CopyConsOnlyType(int) { }
    CopyConsOnlyType(CopyConsOnlyType&&) = delete;
    CopyConsOnlyType(const CopyConsOnlyType&) = default;
    CopyConsOnlyType& operator=(const CopyConsOnlyType&) = delete;
    CopyConsOnlyType& operator=(CopyConsOnlyType&&) = delete;
  };

  struct MoveConsOnlyType
  {
    MoveConsOnlyType(int) { }
    MoveConsOnlyType(const MoveConsOnlyType&) = delete;
    MoveConsOnlyType(MoveConsOnlyType&&) = default;
    MoveConsOnlyType& operator=(const MoveConsOnlyType&) = delete;
    MoveConsOnlyType& operator=(MoveConsOnlyType&&) = delete;
  };
#endif

} // namespace __gnu_test

#endif // _GLIBCXX_TESTSUITE_TR1_H
