1 /*
2  *  Created by Phil on 29/10/2010.
3  *  Copyright 2010 Two Blue Cubes Ltd. All rights reserved.
4  *
5  *  Distributed under the Boost Software License, Version 1.0. (See accompanying
6  *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7  */
8 #ifndef TWOBLUECUBES_CATCH_COMMON_H_INCLUDED
9 #define TWOBLUECUBES_CATCH_COMMON_H_INCLUDED
10 
11 #include "catch_compiler_capabilities.h"
12 
13 #define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line
14 #define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line )
15 #ifdef CATCH_CONFIG_COUNTER
16 #  define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ )
17 #else
18 #  define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ )
19 #endif
20 
21 #include <iosfwd>
22 #include <string>
23 #include <cstdint>
24 
25 // We need a dummy global operator<< so we can bring it into Catch namespace later
26 struct Catch_global_namespace_dummy {};
27 std::ostream& operator<<(std::ostream&, Catch_global_namespace_dummy);
28 
29 namespace Catch {
30 
31     struct CaseSensitive { enum Choice {
32         Yes,
33         No
34     }; };
35 
36     class NonCopyable {
37         NonCopyable( NonCopyable const& )              = delete;
38         NonCopyable( NonCopyable && )                  = delete;
39         NonCopyable& operator = ( NonCopyable const& ) = delete;
40         NonCopyable& operator = ( NonCopyable && )     = delete;
41 
42     protected:
43         NonCopyable();
44         virtual ~NonCopyable();
45     };
46 
47     struct SourceLineInfo {
48 
49         SourceLineInfo() = delete;
SourceLineInfoSourceLineInfo50         SourceLineInfo( char const* _file, std::size_t _line ) noexcept
51         :   file( _file ),
52             line( _line )
53         {}
54 
55         SourceLineInfo( SourceLineInfo const& other )            = default;
56         SourceLineInfo& operator = ( SourceLineInfo const& )     = default;
57         SourceLineInfo( SourceLineInfo&& )              noexcept = default;
58         SourceLineInfo& operator = ( SourceLineInfo&& ) noexcept = default;
59 
emptySourceLineInfo60         bool empty() const noexcept { return file[0] == '\0'; }
61         bool operator == ( SourceLineInfo const& other ) const noexcept;
62         bool operator < ( SourceLineInfo const& other ) const noexcept;
63 
64         char const* file;
65         std::size_t line;
66     };
67 
68     std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info );
69 
70     // Bring in operator<< from global namespace into Catch namespace
71     // This is necessary because the overload of operator<< above makes
72     // lookup stop at namespace Catch
73     using ::operator<<;
74 
75     // Use this in variadic streaming macros to allow
76     //    >> +StreamEndStop
77     // as well as
78     //    >> stuff +StreamEndStop
79     struct StreamEndStop {
80         std::string operator+() const;
81     };
82     template<typename T>
83     T const& operator + ( T const& value, StreamEndStop ) {
84         return value;
85     }
86 }
87 
88 #define CATCH_INTERNAL_LINEINFO \
89     ::Catch::SourceLineInfo( __FILE__, static_cast<std::size_t>( __LINE__ ) )
90 
91 #endif // TWOBLUECUBES_CATCH_COMMON_H_INCLUDED
92 
93