127 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			127 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | //  (C) Copyright Gennadiy Rozental 2001. | ||
|  | //  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) | ||
|  | 
 | ||
|  | //  See http://www.boost.org/libs/test for the library home page. | ||
|  | // | ||
|  | //  File        : $RCSfile$ | ||
|  | // | ||
|  | //  Version     : $Revision$ | ||
|  | // | ||
|  | //  Description : contains definition for setcolor iostream manipulator | ||
|  | // *************************************************************************** | ||
|  | 
 | ||
|  | #ifndef BOOST_TEST_UTILS_SETCOLOR_HPP | ||
|  | #define BOOST_TEST_UTILS_SETCOLOR_HPP | ||
|  | 
 | ||
|  | // Boost.Test | ||
|  | #include <boost/test/detail/config.hpp> | ||
|  | 
 | ||
|  | // STL | ||
|  | #include <iostream> | ||
|  | #include <cstdio> | ||
|  | 
 | ||
|  | #include <boost/test/detail/suppress_warnings.hpp> | ||
|  | 
 | ||
|  | //____________________________________________________________________________// | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | namespace unit_test { | ||
|  | namespace utils { | ||
|  | 
 | ||
|  | // ************************************************************************** // | ||
|  | // **************                    term_attr                 ************** // | ||
|  | // ************************************************************************** // | ||
|  | 
 | ||
|  | struct term_attr { enum _ { | ||
|  |     NORMAL    = 0, | ||
|  |     BRIGHT    = 1, | ||
|  |     DIM       = 2, | ||
|  |     UNDERLINE = 4, | ||
|  |     BLINK     = 5, | ||
|  |     REVERSE   = 7, | ||
|  |     CROSSOUT  = 9 | ||
|  | }; }; | ||
|  | 
 | ||
|  | // ************************************************************************** // | ||
|  | // **************                   term_color                 ************** // | ||
|  | // ************************************************************************** // | ||
|  | 
 | ||
|  | struct term_color { enum _ { | ||
|  |     BLACK    = 0, | ||
|  |     RED      = 1, | ||
|  |     GREEN    = 2, | ||
|  |     YELLOW   = 3, | ||
|  |     BLUE     = 4, | ||
|  |     MAGENTA  = 5, | ||
|  |     CYAN     = 6, | ||
|  |     WHITE    = 7, | ||
|  |     ORIGINAL = 9 | ||
|  | }; }; | ||
|  | 
 | ||
|  | // ************************************************************************** // | ||
|  | // **************                    setcolor                  ************** // | ||
|  | // ************************************************************************** // | ||
|  | 
 | ||
|  | class setcolor { | ||
|  | public: | ||
|  |     // Constructor | ||
|  |     explicit    setcolor( term_attr::_  attr = term_attr::NORMAL, | ||
|  |                           term_color::_ fg   = term_color::ORIGINAL, | ||
|  |                           term_color::_ bg   = term_color::ORIGINAL ) | ||
|  |     { | ||
|  |         m_command_size = std::sprintf( m_control_command, "%c[%d;%d;%dm", 0x1B, attr, fg + 30, bg + 40 ); | ||
|  |     } | ||
|  | 
 | ||
|  |     friend std::ostream& | ||
|  |     operator<<( std::ostream& os, setcolor const& sc ) | ||
|  |     { | ||
|  |         return os.write( sc.m_control_command, sc.m_command_size ); | ||
|  |     } | ||
|  | 
 | ||
|  | private: | ||
|  |     // Data members | ||
|  |     char        m_control_command[13]; | ||
|  |     int         m_command_size; | ||
|  | }; | ||
|  | 
 | ||
|  | // ************************************************************************** // | ||
|  | // **************                 scope_setcolor               ************** // | ||
|  | // ************************************************************************** // | ||
|  | 
 | ||
|  | struct scope_setcolor { | ||
|  |     scope_setcolor() : m_os( 0 ) {} | ||
|  |     explicit    scope_setcolor( std::ostream& os, | ||
|  |                                 term_attr::_  attr = term_attr::NORMAL, | ||
|  |                                 term_color::_ fg   = term_color::ORIGINAL, | ||
|  |                                 term_color::_ bg   = term_color::ORIGINAL ) | ||
|  |     : m_os( &os ) | ||
|  |     { | ||
|  |         os << setcolor( attr, fg, bg ); | ||
|  |     } | ||
|  |     ~scope_setcolor() | ||
|  |     { | ||
|  |         if( m_os ) | ||
|  |             *m_os << setcolor(); | ||
|  |     } | ||
|  | private: | ||
|  |     // Data members | ||
|  |     std::ostream* m_os; | ||
|  | }; | ||
|  | 
 | ||
|  | #define BOOST_TEST_SCOPE_SETCOLOR( is_color_output, os, attr, color )   \ | ||
|  |     utils::scope_setcolor const& sc = is_color_output                   \ | ||
|  |            ? utils::scope_setcolor( os, utils::attr, utils::color )     \ | ||
|  |            : utils::scope_setcolor();                                   \ | ||
|  |     ut_detail::ignore_unused_variable_warning( sc )                     \ | ||
|  | /**/ | ||
|  | 
 | ||
|  | } // namespace utils | ||
|  | } // namespace unit_test | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | #include <boost/test/detail/enable_warnings.hpp> | ||
|  | 
 | ||
|  | #endif // BOOST_TEST_UTILS_SETCOLOR_HPP |