Click here to Skip to main content
15,886,518 members
Articles / Programming Languages / C++

Celero - A C++ Benchmark Authoring Library

Rate me:
Please Sign up or sign in to vote.
4.84/5 (19 votes)
31 Oct 2013Apache7 min read 47.5K   764   49  
This article discusses how to implement and use a template-based C++ benchmarking library.
#include <celero/Console.h>

using namespace celero;

#ifdef WIN32
	#include <Windows.h>
	#include <stdio.h>
#else
	#include <curses.h>
#endif

auto WinColor() -> decltype(GetStdHandle(STD_OUTPUT_HANDLE))
{
	auto h = GetStdHandle(STD_OUTPUT_HANDLE); 
	CONSOLE_SCREEN_BUFFER_INFO csbiInfo; 
	GetConsoleScreenBufferInfo(h, &csbiInfo); 
	return h;
}

void Red()
{
	#ifdef WIN32
		auto h = WinColor();
		SetConsoleTextAttribute(h, FOREGROUND_RED);
	#else
		std::cout << "\033[40m\033[31m";
	#endif
}

void RedBold()
{
	#ifdef WIN32
		auto h = WinColor();
		SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_INTENSITY);
	#else
		std::cout << "\033[40m\033[1;31m";
	#endif
}

void Green()
{
	#ifdef WIN32
		auto h = WinColor();
		SetConsoleTextAttribute(h, FOREGROUND_GREEN);
	#else
		std::cout << "\033[40m\033[32m";
	#endif
}

void GreenBold()
{
	#ifdef WIN32
		auto h = WinColor();
		SetConsoleTextAttribute(h, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
	#else
		std::cout << "\033[40m\033[1;32m";
	#endif
}

void Blue()
{
	#ifdef WIN32
		auto h = WinColor();
		SetConsoleTextAttribute(h, FOREGROUND_BLUE);
	#else
		std::cout << "\033[40m\033[34m";
	#endif
}

void BlueBold()
{
	#ifdef WIN32
		auto h = WinColor();
		SetConsoleTextAttribute(h, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
	#else
		std::cout << "\033[40m\033[1;34m";
	#endif
}

void Cyan()
{
	#ifdef WIN32
		auto h = WinColor();
		SetConsoleTextAttribute(h, FOREGROUND_BLUE | FOREGROUND_GREEN);
	#else
		std::cout << "\033[40m\033[36m";
	#endif
}

void CyanBold()
{
	#ifdef WIN32
		auto h = WinColor();
		SetConsoleTextAttribute(h, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
	#else
		std::cout << "\033[40m\033[1;36m";
	#endif
}

void Yellow()
{
	#ifdef WIN32
		auto h = WinColor();
		SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_GREEN);
	#else
		std::cout << "\033[40m\033[33m";
	#endif
}

void YellowBold()
{
	#ifdef WIN32
		auto h = WinColor();
		SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
	#else
		std::cout << "\033[40m\033[1;33m";
	#endif
}

void White()
{
	#ifdef WIN32
		auto h = WinColor();
		SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
	#else
		std::cout << "\033[40m\033[37m";
	#endif
}

void WhiteBold()
{
	#ifdef WIN32
		auto h = WinColor();
		SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
	#else
		std::cout << "\033[40m\033[1;37m";
	#endif
}

void WhiteOnRed()
{
	#ifdef WIN32
		auto h = WinColor();
		SetConsoleTextAttribute(h, BACKGROUND_RED | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
	#else
		std::cout << "\033[41m\033[37m";
	#endif
}

void WhiteOnRedBold()
{
	#ifdef WIN32
		auto h = WinColor();
		SetConsoleTextAttribute(h, BACKGROUND_RED | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
	#else
		std::cout << "\033[41m\033[1;37m";
	#endif
}

void PurpleBold()
{
	#ifdef WIN32
		auto h = WinColor();
		SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
	#else
		std::cout << "\033[40m\033[1;38m";
	#endif
}

void Default()
{
	#ifdef WIN32
		White();
	#else
		std::cout << "\033[0m";
	#endif
}

void celero::console::SetConsoleColor(const celero::console::ConsoleColor x)
{
	switch(x) 
	{
		case ConsoleColor_Red:				Red();				break;
		case ConsoleColor_Red_Bold:			RedBold();			break;
		case ConsoleColor_Green:			Green();			break;
		case ConsoleColor_Green_Bold:		GreenBold();		break;
		case ConsoleColor_Blue:				Blue();				break;
		case ConsoleColor_Blue_Bold:		BlueBold();			break;
		case ConsoleColor_Cyan:				Cyan();				break;
		case ConsoleColor_Cyan_Bold:		CyanBold();			break;
		case ConsoleColor_Yellow:			Yellow();			break;
		case ConsoleColor_Yellow_Bold:		YellowBold();		break;
		case ConsoleColor_White:			White();			break;
		case ConsoleColor_White_Bold:		WhiteBold();		break;
		case ConsoleColor_WhiteOnRed:		WhiteOnRed(); 		break;
		case ConsoleColor_WhiteOnRed_Bold:	WhiteOnRedBold();	break;
		case ConsoleColor_Purple_Bold:		PurpleBold();		break;	
		case ConsoleColor_Default:
		default:							Default();			break;
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Apache License, Version 2.0


Written By
Team Leader
United States United States
John Farrier is a professional C++ software engineer that specializes in modeling, simulation, and architecture development.

Specialties:

LVC Modeling & Simulation
Software Engineering, C++11, C++98, C, C#, FORTRAN, Python
Software Performance Optimization
Software Requirements Development
Technical Project and Team Leadership

Comments and Discussions