Blame c++/perspective/src/common.h

Ivan Mahonin 531f67
#ifndef COMMON_H
Ivan Mahonin 531f67
#define COMMON_H
Ivan Mahonin 531f67
Ivan Mahonin 531f67
#include <cmath>
Ivan Mahonin 531f67
#include <cstdlib>
Ivan Mahonin 531f67
Ivan Mahonin 531f67
Ivan Mahonin 531f67
typedef float ColorReal;
Ivan Mahonin 531f67
typedef double Real;
Ivan Mahonin 531f67
typedef int Int;
Ivan Mahonin 531f67
typedef unsigned int UInt;
Ivan Mahonin 531f67
typedef long long int LongInt;
Ivan Mahonin 531f67
typedef unsigned long long int ULongInt;
Ivan Mahonin 531f67
Ivan Mahonin 531f67
Ivan Mahonin 531f67
const Real realRrecision = 1e-10;
Ivan Mahonin 531f67
Ivan Mahonin 531f67
Ivan Mahonin 531f67
class Shared {
Ivan Mahonin 531f67
private:
Ivan Mahonin 531f67
	int ref_count;
Ivan Mahonin 531f67
public:
Ivan Mahonin 531f67
	Shared(): ref_count() { }
Ivan Mahonin 531f67
	Shared(const Shared&): ref_count() { }
Ivan Mahonin 531f67
	virtual ~Shared() { };
Ivan Mahonin 531f67
	
Ivan Mahonin 531f67
	inline Shared& operator=(const Shared&) { return *this; }
Ivan Mahonin 531f67
	inline void reference() { ++ref_count; }
Ivan Mahonin 531f67
	inline void unreference() { if (--ref_count <= 0) delete this; }
Ivan Mahonin 531f67
};
Ivan Mahonin 531f67
Ivan Mahonin 531f67
Ivan Mahonin 531f67
class Color {
Ivan Mahonin 531f67
public:
Ivan Mahonin 531f67
	typedef ColorReal Channel;
Ivan Mahonin 531f67
	union {
Ivan Mahonin 531f67
		struct { Channel channels[4]; };
Ivan Mahonin 531f67
		struct { Channel r, g, b, a; };
Ivan Mahonin 531f67
	};
Ivan Mahonin 531f67
	
Ivan Mahonin 531f67
	inline explicit Color(Channel r = 0.0, Channel g = 0.0, Channel b = 0.0, Channel a = 0.0):
Ivan Mahonin 531f67
		r(r), g(g), b(b), a(a) { }
Ivan Mahonin 531f67
};
Ivan Mahonin 531f67
Ivan Mahonin 531f67
inline int clz(const Int &x)
Ivan Mahonin 531f67
	{ return x ? __builtin_clz(x) : 32; }
Ivan Mahonin 531f67
inline int clz(const UInt &x)
Ivan Mahonin 531f67
	{ return x ? __builtin_clz(x) : 32; }
Ivan Mahonin 531f67
inline int clz(const LongInt &x)
Ivan Mahonin 531f67
	{ return x ? __builtin_clzll(x) : 64; }
Ivan Mahonin 531f67
inline int clz(const ULongInt &x)
Ivan Mahonin 531f67
	{ return x ? __builtin_clzll(x) : 64; }
Ivan Mahonin 531f67
Ivan Mahonin 531f67
Ivan Mahonin 531f67
inline Real flip_clamp(Real x) {
Ivan Mahonin 531f67
	x -= floor(0.5*x)*2.0;
Ivan Mahonin 531f67
	return 1.0 - fabs(1.0 - x);
Ivan Mahonin 531f67
}
Ivan Mahonin 531f67
Ivan Mahonin 531f67
#endif