diff interps/sadol/pch.hpp @ 996:859f9b4339e6

<Gregor> tar xf egobot.tar.xz
author HackBot
date Sun, 09 Dec 2012 19:30:08 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interps/sadol/pch.hpp	Sun Dec 09 19:30:08 2012 +0000
@@ -0,0 +1,150 @@
+/*
+ * 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