text: /*
   *  Created by Phil on 7/1/2011
   *  Copyright 2010 Two Blue Cubes Ltd. All rights reserved.
   *
   *  Distributed under the Boost Software License, Version 1.0. (See accompanying
   *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
   */
  #ifndef TWOBLUECUBES_CATCH_TEST_CASE_REGISTRY_IMPL_HPP_INCLUDED
  #define TWOBLUECUBES_CATCH_TEST_CASE_REGISTRY_IMPL_HPP_INCLUDED
  
  #include "catch_test_registry.h"
  #include "catch_test_spec.h"
  #include "catch_interfaces_config.h"
  
  #include <vector>
  #include <set>
  #include <algorithm>
  #include <ios>
  
  namespace Catch {
  
      class TestCase;
      struct IConfig;
  
      std::vector<TestCase> sortTests( IConfig const& config, std::vector<TestCase> const& unsortedTestCases );
  
      bool isThrowSafe( TestCase const& testCase, IConfig const& config );
      bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config );
  
      void enforceNoDuplicateTestCases( std::vector<TestCase> const& functions );
  
      std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config );
      std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config );
  
      class TestRegistry : public ITestCaseRegistry {
      public:
          virtual ~TestRegistry() = default;
  
          virtual void registerTest( TestCase const& testCase );
  
          std::vector<TestCase> const& getAllTests() const override;
          std::vector<TestCase> const& getAllTestsSorted( IConfig const& config ) const override;
  
      private:
          std::vector<TestCase> m_functions;
          mutable RunTests::InWhatOrder m_currentSortOrder = RunTests::InDeclarationOrder;
          mutable std::vector<TestCase> m_sortedFunctions;
          std::size_t m_unnamedCount = 0;
          std::ios_base::Init m_ostreamInit; // Forces cout/ cerr to be initialised
      };
  
      ///////////////////////////////////////////////////////////////////////////
  
      class TestInvokerAsFunction : public ITestInvoker {
          void(*m_testAsFunction)();
      public:
          TestInvokerAsFunction( void(*testAsFunction)() ) noexcept;
  
          void invoke() const override;
      };
  
  
      std::string extractClassName( StringRef const& classOrQualifiedMethodName );
  
      ///////////////////////////////////////////////////////////////////////////
  
  
  } // end namespace Catch
  
  
  #endif // TWOBLUECUBES_CATCH_TEST_CASE_REGISTRY_IMPL_HPP_INCLUDED
  