1 #ifndef BOOST_ASSERT_SOURCE_LOCATION_HPP_INCLUDED
2 #define BOOST_ASSERT_SOURCE_LOCATION_HPP_INCLUDED
3 
4 //  http://www.boost.org/libs/assert
5 //
6 //  Copyright 2019 Peter Dimov
7 //  Distributed under the Boost Software License, Version 1.0.
8 //  http://www.boost.org/LICENSE_1_0.txt
9 
10 #include <boost/current_function.hpp>
11 #include <boost/config.hpp>
12 #include <boost/cstdint.hpp>
13 #include <iosfwd>
14 
15 namespace boost
16 {
17 
18 struct source_location
19 {
20 private:
21 
22     char const * file_;
23     char const * function_;
24     boost::uint_least32_t line_;
25     boost::uint_least32_t column_;
26 
27 public:
28 
source_locationboost::source_location29     BOOST_CONSTEXPR source_location() BOOST_NOEXCEPT: file_( "(unknown)" ), function_( "(unknown)" ), line_( 0 ), column_( 0 )
30     {
31     }
32 
source_locationboost::source_location33     BOOST_CONSTEXPR source_location( char const * file, boost::uint_least32_t ln, char const * function, boost::uint_least32_t col = 0 ) BOOST_NOEXCEPT: file_( file ), function_( function ), line_( ln ), column_( col )
34     {
35     }
36 
file_nameboost::source_location37     BOOST_CONSTEXPR char const * file_name() const BOOST_NOEXCEPT
38     {
39         return file_;
40     }
41 
function_nameboost::source_location42     BOOST_CONSTEXPR char const * function_name() const BOOST_NOEXCEPT
43     {
44         return function_;
45     }
46 
lineboost::source_location47     BOOST_CONSTEXPR boost::uint_least32_t line() const BOOST_NOEXCEPT
48     {
49         return line_;
50     }
51 
columnboost::source_location52     BOOST_CONSTEXPR boost::uint_least32_t column() const BOOST_NOEXCEPT
53     {
54         return column_;
55     }
56 };
57 
operator <<(std::basic_ostream<E,T> & os,source_location const & loc)58 template<class E, class T> std::basic_ostream<E, T> & operator<<( std::basic_ostream<E, T> & os, source_location const & loc )
59 {
60     os.width( 0 );
61 
62     if( loc.line() == 0 )
63     {
64         os << "(unknown source location)";
65     }
66     else
67     {
68         os << loc.file_name() << ':' << loc.line();
69 
70         if( loc.column() )
71         {
72             os << ':' << loc.column();
73         }
74 
75         os << ": in function '" << loc.function_name() << '\'';
76     }
77 
78     return os;
79 }
80 
81 } // namespace boost
82 
83 #if defined( BOOST_DISABLE_CURRENT_LOCATION )
84 
85 #  define BOOST_CURRENT_LOCATION ::boost::source_location()
86 
87 #elif defined(__clang_analyzer__)
88 
89 // Cast to char const* to placate clang-tidy
90 // https://bugs.llvm.org/show_bug.cgi?id=28480
91 #  define BOOST_CURRENT_LOCATION ::boost::source_location(__FILE__, __LINE__, static_cast<char const*>(BOOST_CURRENT_FUNCTION))
92 
93 #else
94 
95 #  define BOOST_CURRENT_LOCATION ::boost::source_location(__FILE__, __LINE__, BOOST_CURRENT_FUNCTION)
96 
97 #endif
98 
99 #endif // #ifndef BOOST_ASSERT_SOURCE_LOCATION_HPP_INCLUDED
100