mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-11-03 21:49:32 +01:00 
			
		
		
		
	Factored Approx out into own file
This commit is contained in:
		@@ -29,6 +29,7 @@
 | 
				
			|||||||
#include "internal/catch_section.hpp"
 | 
					#include "internal/catch_section.hpp"
 | 
				
			||||||
#include "internal/catch_generators.hpp"
 | 
					#include "internal/catch_generators.hpp"
 | 
				
			||||||
#include "internal/catch_interfaces_exception.h"
 | 
					#include "internal/catch_interfaces_exception.h"
 | 
				
			||||||
 | 
					#include "internal/catch_approx.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __OBJC__
 | 
					#ifdef __OBJC__
 | 
				
			||||||
#include "internal/catch_objc.hpp"
 | 
					#include "internal/catch_objc.hpp"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										88
									
								
								include/internal/catch_approx.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								include/internal/catch_approx.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,88 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 *  catch_approx.hpp
 | 
				
			||||||
 | 
					 *  Catch
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  Created by Phil on 28/04/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_APPROX_HPP_INCLUDED
 | 
				
			||||||
 | 
					#define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "catch_capture.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <cmath>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Catch
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // !TBD Need to clean this all up
 | 
				
			||||||
 | 
					#define CATCH_absTol 1e-10
 | 
				
			||||||
 | 
					#define CATCH_relTol 1e-10
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    inline double catch_max( double x, double y )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return x > y ? x : y;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    namespace Detail
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        class Approx
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					        public:
 | 
				
			||||||
 | 
					            ///////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					            // !TBD more generic
 | 
				
			||||||
 | 
					            explicit Approx
 | 
				
			||||||
 | 
					            (
 | 
				
			||||||
 | 
					             double d
 | 
				
			||||||
 | 
					             )
 | 
				
			||||||
 | 
					            : m_d( d )
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            ///////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					            template<typename T>
 | 
				
			||||||
 | 
					            friend bool operator == 
 | 
				
			||||||
 | 
					            (
 | 
				
			||||||
 | 
					             const T& lhs, 
 | 
				
			||||||
 | 
					             const Approx& rhs
 | 
				
			||||||
 | 
					             )
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                // !TBD Use proper tolerance
 | 
				
			||||||
 | 
					                // From: http://realtimecollisiondetection.net/blog/?p=89
 | 
				
			||||||
 | 
					                // see also: http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
 | 
				
			||||||
 | 
					                return fabs( lhs - rhs.m_d ) <= catch_max( CATCH_absTol, CATCH_relTol * catch_max( fabs(lhs), fabs(rhs.m_d) ) );
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            ///////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					            template<typename T>
 | 
				
			||||||
 | 
					            friend bool operator != 
 | 
				
			||||||
 | 
					            (
 | 
				
			||||||
 | 
					             const T& lhs, 
 | 
				
			||||||
 | 
					             const Approx& rhs
 | 
				
			||||||
 | 
					             )
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return ! operator==( lhs, rhs );
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            double m_d;
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    ///////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					    template<>
 | 
				
			||||||
 | 
					    inline std::string toString<Detail::Approx>
 | 
				
			||||||
 | 
					    (
 | 
				
			||||||
 | 
					        const Detail::Approx& value
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        std::ostringstream oss;
 | 
				
			||||||
 | 
					        oss << "Approx( " << value.m_d << ")";
 | 
				
			||||||
 | 
					        return oss.str();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					} // end namespace Catch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED
 | 
				
			||||||
@@ -17,8 +17,9 @@
 | 
				
			|||||||
#include "catch_interfaces_capture.h"
 | 
					#include "catch_interfaces_capture.h"
 | 
				
			||||||
#include "catch_debugger.hpp"
 | 
					#include "catch_debugger.hpp"
 | 
				
			||||||
#include "catch_evaluate.hpp"
 | 
					#include "catch_evaluate.hpp"
 | 
				
			||||||
 | 
					#include "catch_hub.h"
 | 
				
			||||||
 | 
					#include "catch_common.h"
 | 
				
			||||||
#include <sstream>
 | 
					#include <sstream>
 | 
				
			||||||
#include <cmath>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Catch
 | 
					namespace Catch
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -642,72 +643,7 @@ public:
 | 
				
			|||||||
private:
 | 
					private:
 | 
				
			||||||
    std::ostringstream m_oss;
 | 
					    std::ostringstream m_oss;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
// !TBD Need to clean this all up
 | 
					 | 
				
			||||||
#define CATCH_absTol 1e-10
 | 
					 | 
				
			||||||
#define CATCH_relTol 1e-10
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline double catch_max( double x, double y )
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return x > y ? x : y;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
namespace Detail
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    class Approx
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
    public:
 | 
					 | 
				
			||||||
        ///////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
        // !TBD more generic
 | 
					 | 
				
			||||||
        explicit Approx
 | 
					 | 
				
			||||||
        (
 | 
					 | 
				
			||||||
            double d
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
        : m_d( d )
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        ///////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
        template<typename T>
 | 
					 | 
				
			||||||
        friend bool operator == 
 | 
					 | 
				
			||||||
        (
 | 
					 | 
				
			||||||
            const T& lhs, 
 | 
					 | 
				
			||||||
            const Approx& rhs
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            // !TBD Use proper tolerance
 | 
					 | 
				
			||||||
            // From: http://realtimecollisiondetection.net/blog/?p=89
 | 
					 | 
				
			||||||
            // see also: http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
 | 
					 | 
				
			||||||
            return fabs( lhs - rhs.m_d ) <= catch_max( CATCH_absTol, CATCH_relTol * catch_max( fabs(lhs), fabs(rhs.m_d) ) );
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        ///////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
        template<typename T>
 | 
					 | 
				
			||||||
        friend bool operator != 
 | 
					 | 
				
			||||||
        (
 | 
					 | 
				
			||||||
            const T& lhs, 
 | 
					 | 
				
			||||||
            const Approx& rhs
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return ! operator==( lhs, rhs );
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        double m_d;
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
///////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
template<>
 | 
					 | 
				
			||||||
    inline std::string toString<Detail::Approx>
 | 
					 | 
				
			||||||
(
 | 
					 | 
				
			||||||
    const Detail::Approx& value
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    std::ostringstream oss;
 | 
					 | 
				
			||||||
    oss << "Approx( " << value.m_d << ")";
 | 
					 | 
				
			||||||
    return oss.str();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
///////////////////////////////////////////////////////////////////////////////
 | 
					///////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
// This is just here to avoid compiler warnings with macro constants
 | 
					// This is just here to avoid compiler warnings with macro constants
 | 
				
			||||||
inline bool isTrue
 | 
					inline bool isTrue
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -75,6 +75,7 @@
 | 
				
			|||||||
		4A060D14136203B800BBA8F8 /* catch_reporter_registrars.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_reporter_registrars.hpp; path = ../../include/internal/catch_reporter_registrars.hpp; sourceTree = SOURCE_ROOT; };
 | 
							4A060D14136203B800BBA8F8 /* catch_reporter_registrars.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_reporter_registrars.hpp; path = ../../include/internal/catch_reporter_registrars.hpp; sourceTree = SOURCE_ROOT; };
 | 
				
			||||||
		4A060D15136203B800BBA8F8 /* catch_xmlwriter.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_xmlwriter.hpp; path = ../../include/internal/catch_xmlwriter.hpp; sourceTree = SOURCE_ROOT; };
 | 
							4A060D15136203B800BBA8F8 /* catch_xmlwriter.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_xmlwriter.hpp; path = ../../include/internal/catch_xmlwriter.hpp; sourceTree = SOURCE_ROOT; };
 | 
				
			||||||
		4A060D16136203B800BBA8F8 /* catch_generators_impl.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_generators_impl.hpp; path = ../../include/internal/catch_generators_impl.hpp; sourceTree = SOURCE_ROOT; };
 | 
							4A060D16136203B800BBA8F8 /* catch_generators_impl.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_generators_impl.hpp; path = ../../include/internal/catch_generators_impl.hpp; sourceTree = SOURCE_ROOT; };
 | 
				
			||||||
 | 
							4A1A22AF136946E0002FDDE0 /* catch_approx.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = catch_approx.hpp; path = ../../include/internal/catch_approx.hpp; sourceTree = SOURCE_ROOT; };
 | 
				
			||||||
		8DD76F6C0486A84900D96B5E /* Test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Test; sourceTree = BUILT_PRODUCTS_DIR; };
 | 
							8DD76F6C0486A84900D96B5E /* Test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Test; sourceTree = BUILT_PRODUCTS_DIR; };
 | 
				
			||||||
		C6859E8B029090EE04C91782 /* Test.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = Test.1; sourceTree = "<group>"; };
 | 
							C6859E8B029090EE04C91782 /* Test.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = Test.1; sourceTree = "<group>"; };
 | 
				
			||||||
/* End PBXFileReference section */
 | 
					/* End PBXFileReference section */
 | 
				
			||||||
@@ -149,6 +150,7 @@
 | 
				
			|||||||
				4A060CFD136203B800BBA8F8 /* catch_runner_impl.hpp */,
 | 
									4A060CFD136203B800BBA8F8 /* catch_runner_impl.hpp */,
 | 
				
			||||||
				4A060D0C136203B800BBA8F8 /* catch_interfaces_runner.h */,
 | 
									4A060D0C136203B800BBA8F8 /* catch_interfaces_runner.h */,
 | 
				
			||||||
				4A060D0D136203B800BBA8F8 /* catch_generators.hpp */,
 | 
									4A060D0D136203B800BBA8F8 /* catch_generators.hpp */,
 | 
				
			||||||
 | 
									4A1A22AF136946E0002FDDE0 /* catch_approx.hpp */,
 | 
				
			||||||
			);
 | 
								);
 | 
				
			||||||
			name = "Running & Results";
 | 
								name = "Running & Results";
 | 
				
			||||||
			sourceTree = "<group>";
 | 
								sourceTree = "<group>";
 | 
				
			||||||
@@ -274,7 +276,14 @@
 | 
				
			|||||||
			isa = PBXProject;
 | 
								isa = PBXProject;
 | 
				
			||||||
			buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "CatchSelfTest" */;
 | 
								buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "CatchSelfTest" */;
 | 
				
			||||||
			compatibilityVersion = "Xcode 3.1";
 | 
								compatibilityVersion = "Xcode 3.1";
 | 
				
			||||||
 | 
								developmentRegion = English;
 | 
				
			||||||
			hasScannedForEncodings = 1;
 | 
								hasScannedForEncodings = 1;
 | 
				
			||||||
 | 
								knownRegions = (
 | 
				
			||||||
 | 
									English,
 | 
				
			||||||
 | 
									Japanese,
 | 
				
			||||||
 | 
									French,
 | 
				
			||||||
 | 
									German,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
			mainGroup = 08FB7794FE84155DC02AAC07 /* Test */;
 | 
								mainGroup = 08FB7794FE84155DC02AAC07 /* Test */;
 | 
				
			||||||
			projectDirPath = "";
 | 
								projectDirPath = "";
 | 
				
			||||||
			projectRoot = "";
 | 
								projectRoot = "";
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user