view interps/sadol/pch.hpp @ 6842:76c0c1881313

<olsner> learn The internet is for everything. However many thing can done even without internet too, often better without use of internet, but internet is good too.
author HackBot
date Mon, 15 Feb 2016 01:09:11 +0000
parents 859f9b4339e6
children
line wrap: on
line source

/*
 * BDSM2
 * Author: Adam Sawicki
 * http://www.regedit.risp.pl
 * mailto:regedit@risp.pl
 */
/* Precompiled header */
#ifndef PCH_H_
#define PCH_H_

#include <cstdio>
#include <cmath>
#include <cstdlib> // for exit, atoi, atof etc.
#include <string>
#include <vector>
#include <algorithm> // for swap

using std::string;

// 'function': was declared deprecated
#pragma warning(disable: 4996)

const size_t BUF_SIZE = 1024;

enum ERR_PLACE {
	ERR_GENERAL = 1,
	ERR_PARSE = 2,
	ERR_OPTIMIZE = 3,
	ERR_EXECUTE = 4,
	ERR_IO = 5,
};

inline void ReverseString(string *s)
{
	size_t i = 0;
	size_t j = s->length()-1;
	while (i < j) std::swap( (*s)[i++], (*s)[j--] );
}

// convert number to digit in any base ('0'..'9', 'A'..'Z', 'a'..'z')
template <typename T>
char DigitToChar(T Digit, bool UpperCase = true)
{
	if (Digit < 10) return static_cast<char>(Digit+'0');
	else {
		if (UpperCase) return static_cast<char>(Digit-10+'A');
		else           return static_cast<char>(Digit-10+'a');
	}
}

// Convert unsigned number to string
template <typename T>
void UintToStr(T Number, string *str, int Base = 10, bool UpperCase = true)
{
	T BaseT = static_cast<T>(Base);
	str->clear();
	char ch;
	while (Number != 0) {
		ch = DigitToChar<T>(Number % BaseT, UpperCase);
		Number /= BaseT;
		*str += ch;
	}
	if (str->empty()) *str = '0';
	else ReverseString(str);
}

// convert signed number to string
template <typename T>
void IntToStr(T Number, string *str, unsigned Base = 10, bool UpperCase = true)
{
	T BaseT = static_cast<T>(Base);
	int Sign = ( Number >= T() ? +1 : -1 );
	if (Sign == -1) Number = -Number;
	str->clear();
	char ch;
	while (Number != 0) {
		ch = DigitToChar<T>(Number % BaseT, UpperCase);
		Number /= BaseT;
		*str += ch;
	}
	if (str->empty()) *str = '0';
	if (Sign < 0) *str += '-';
	ReverseString(str);
}

// Convert unsigned number to string, return it
inline string IntToStr(unsigned x, int base = 10, bool UpperCase = true)
{
	string r;
	UintToStr(x, &r, base, UpperCase);
	return r;
}

// Convert signed number to string, return it
inline string IntToStr(int x, int base = 10, bool UpperCase = true)
{
	string r;
	IntToStr(x, &r, base, UpperCase);
	return r;
}

// Convert size to string
inline void Size_tToStr(size_t x, string *str, int base = 10, bool UpperCase = true)
{
	typedef unsigned int DestType;
	UintToStr<DestType>(static_cast<DestType>(x), str, base, UpperCase);
}

/// Convert size to string, return it
inline string Size_tToStr(size_t x, int base = 10)
{
	string r;
	Size_tToStr(x, &r, base);
	return r;
}

// Convert double precision floating point number to string
// Mode:
// - 'e' : -0.12345e-001
// - 'E' : -0.12345E-001
// - 'f' : -0.12345
// - 'g' : optimum ('e', 'f')
// - 'G' : optimum ('E', 'f')
inline string DoubleToStr(double x, char mode = 'f', int precision = 6)
{
	char sz[256];
	sprintf(sz, string("%." + IntToStr(precision) + mode).c_str(), x);
	return string(sz);
}

inline string CharToStr(char x)
{
	return string() + x;
}

inline double CharToDouble(char ch)
{
	return (double)(unsigned int)(unsigned char)ch;
}

// Round a number instead of truncating it
inline int Round(double x)
{
	return static_cast<int>(floor(x+0.5));
}

// Print error message and terminate process
void Error(const string &Msg, ERR_PLACE Place = ERR_GENERAL);

#endif