src/types.h

changeset 493
16766ac1bbd9
parent 461
fbcc91ae1dd2
child 494
bd005c78a089
--- a/src/types.h	Thu Oct 03 18:07:06 2013 +0300
+++ b/src/types.h	Thu Oct 03 20:56:20 2013 +0300
@@ -62,275 +62,311 @@
 //
 // A mathematical 3 x 3 matrix
 // =============================================================================
-class matrix {
-public:
-	matrix() {}
-	matrix (initlist<double> vals);
-	matrix (double fillval);
-	matrix (double vals[]);
-	
-	double			determinant	() const;
-	matrix			mult			(matrix other) const;
-	void			puts			() const;
-	str				stringRep		() const;
-	void			zero			();
-	double&			val				(const uint idx) { return m_vals[idx]; }
-	const double&	val				(const uint idx) const { return m_vals[idx]; }
-	
-	matrix&			operator=		(matrix other);
-	matrix			operator*		(matrix other) const { return mult (other); }
-	double&			operator[]		(const uint idx) { return m_vals[idx]; }
-	const double&	operator[]		(const uint idx) const { return m_vals[idx]; }
+class matrix
+{	public:
+		matrix() {}
+		matrix (initlist<double> vals);
+		matrix (double fillval);
+		matrix (double vals[]);
+
+		double			determinant	() const;
+		matrix			mult	(matrix other) const;
+		void			puts	() const;
+		str				stringRep	() const;
+		void			zero	();
+		matrix&			operator=	(matrix other);
+
+		inline double& val (const uint idx)
+		{	return m_vals[idx];
+		}
 
-private:
-	double m_vals[9];
+		inline const double val (const uint idx) const
+		{	return m_vals[idx];
+		}
+
+		inline matrix operator* (matrix other) const
+		{	return mult (other);
+		}
+
+		inline double& operator[] (const uint idx)
+		{	return val (idx);
+		}
+		inline const double& operator[] (const uint idx) const
+		{	return val (idx);
+		}
+
+	private:
+		double m_vals[9];
 };
 
 // =============================================================================
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 // vertex
-// 
+//
 // Vertex class, contains a single point in 3D space. Not to be confused with
 // LDVertex, which is a vertex used in an LDraw part file.
 // =============================================================================
-class vertex {
-public:
-	vertex() {}
-	vertex (double x, double y, double z);
-	
-	double&			coord			(const ushort n) { return m_coords[n]; }
-	const double&	coord			(const ushort n) const { return m_coords[n]; }
-	vertex			midpoint		(const vertex& other);
-	void			move			(const vertex& other);
-	str				stringRep		(bool mangled) const;
-	void			transform		(matrix matr, vertex pos);
-	double&			x				() { return m_coords[X]; }
-	const double&	x				() const { return m_coords[X]; }
-	double&			y				() { return m_coords[Y]; }
-	const double&	y				() const { return m_coords[Y]; }
-	double&			z				() { return m_coords[Z]; }
-	const double&	z				() const { return m_coords[Z]; }
-	
-	vertex&			operator+=		(const vertex& other);
-	vertex			operator+		(const vertex& other) const;
-	vertex			operator/		(const double d) const;
-	vertex&			operator/=		(const double d);
-	bool			operator==		(const vertex& other) const;
-	bool			operator!=		(const vertex& other) const;
-	vertex			operator-		() const;
-	int				operator<		(const vertex& other) const;
-	double&			operator[]		(const Axis ax);
-	const double&	operator[]		(const Axis ax) const;
-	double&			operator[]		(const int ax);
-	const double&	operator[]		(const int ax) const;
+class vertex
+{	public:
+		vertex() {}
+		vertex (double x, double y, double z);
+
+		double&			coord	(const ushort n)
+		{	return m_coords[n];
+		}
+		const double&	coord	(const ushort n) const
+		{	return m_coords[n];
+		}
+		vertex			midpoint	(const vertex& other);
+		void			move	(const vertex& other);
+		str				stringRep	(bool mangled) const;
+		void			transform	(matrix matr, vertex pos);
+
+		inline double& x ()
+		{	return m_coords[X];
+		}
+
+		inline const double& x () const
+		{	return m_coords[X];
+		}
+
+		inline double& y ()
+		{	return m_coords[Y];
+		}
 
-private:
-	double m_coords[3];
+		inline const double& y () const
+		{	return m_coords[Y];
+		}
+
+		inline double& z ()
+		{	return m_coords[Z];
+		}
+
+		inline const double& z () const
+		{	return m_coords[Z];
+		}
+
+		vertex&			operator+=	(const vertex& other);
+		vertex			operator+	(const vertex& other) const;
+		vertex			operator/	(const double d) const;
+		vertex&			operator/=	(const double d);
+		bool			operator==	(const vertex& other) const;
+		bool			operator!=	(const vertex& other) const;
+		vertex			operator-	() const;
+		int				operator<	(const vertex& other) const;
+		double&			operator[]	(const Axis ax);
+		const double&	operator[]	(const Axis ax) const;
+		double&			operator[]	(const int ax);
+		const double&	operator[]	(const int ax) const;
+
+	private:
+		double m_coords[3];
 };
 
 // =============================================================================
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 // List
-// 
+//
 // Array class that wraps around std::deque
 // =============================================================================
-template<class T> class List {
-public:
-	typedef typename std::deque<T>::iterator it;
-	typedef typename std::deque<T>::const_iterator c_it;
-	typedef typename std::deque<T>::reverse_iterator r_it;
-	typedef typename std::deque<T>::const_reverse_iterator cr_it;
-	
-	List() {}
-	List (initlist<T> vals) {
-		m_vect = vals;
-	}
-	
-	it begin() {
-		return m_vect.begin();
-	}
-	
-	c_it begin() const {
-		return m_vect.cbegin();
-	}
-	
-	it end() {
-		return m_vect.end();
-	}
-	
-	c_it end() const {
-		return m_vect.cend();
-	}
-	
-	r_it rbegin() {
-		return m_vect.rbegin();
-	}
-	
-	cr_it crbegin() const {
-		return m_vect.crbegin();
-	}
-	
-	r_it rend() {
-		return m_vect.rend();
-	}
-	
-	cr_it crend() const {
-		return m_vect.crend();
-	}
-	
-	void erase (ulong pos) {
-		assert (pos < size());
-		m_vect.erase (m_vect.begin() + pos);
-	}
-	
-	T& push_back (const T& value) {
-		m_vect.push_back (value);
-		return m_vect[m_vect.size() - 1];
-	}
-	
-	void push_back (const List<T>& vals) {
-		for (const T& val : vals)
-			push_back (val);
-	}
-	
-	bool pop (T& val) {
-		if (size() == 0)
-			return false;
-		
-		val = m_vect[size() - 1];
-		erase (size() - 1);
-		return true;
-	}
-	
-	T& operator<< (const T& value) {
-		return push_back (value);
-	}
-	
-	void operator<< (const List<T>& vals) {
-		push_back (vals);
-	}
-	
-	bool operator>> (T& value) {
-		return pop (value);
-	}
-	
-	List<T> reverse() const {
-		List<T> rev;
-		
-		for (const T& val : c_rev<T> (*this))
-			rev << val;
-		
-		return rev;
-	}
-	
-	void clear() {
-		m_vect.clear();
-	}
-	
-	void insert (ulong pos, const T& value) {
-		m_vect.insert (m_vect.begin() + pos, value);
-	}
-	
-	void makeUnique() {
-		// Remove duplicate entries. For this to be effective, the List must be
-		// sorted first.
-		sort();
-		it pos = std::unique (begin(), end());
-		resize (std::distance (begin(), pos));
-	}
-	
-	ulong size() const {
-		return m_vect.size();
-	}
-	
-	T& operator[] (ulong n) {
-		assert (n < size());
-		return m_vect[n];
-	}
-	
-	const T& operator[] (ulong n) const {
-		assert (n < size());
-		return m_vect[n];
-	}
-	
-	void resize (std::ptrdiff_t size) {
-		m_vect.resize (size);
-	}
-	
-	void sort() {
-		std::sort (begin(), end());
-	}
-	
-	ulong find (const T& needle) {
-		ulong i = 0;
-		for (const T& hay : *this) {
-			if (hay == needle)
-				return i;
-			
-			i++;
+template<class T> class List
+{	public:
+		typedef typename std::deque<T>::iterator it;
+		typedef typename std::deque<T>::const_iterator c_it;
+		typedef typename std::deque<T>::reverse_iterator r_it;
+		typedef typename std::deque<T>::const_reverse_iterator cr_it;
+
+		List() {}
+		List (initlist<T> vals)
+		{	m_vect = vals;
+		}
+
+		inline it begin()
+		{	return m_vect.begin();
+		}
+
+		inline c_it begin() const
+		{	return m_vect.cbegin();
+		}
+
+		inline it end()
+		{	return m_vect.end();
+		}
+
+		inline c_it end() const
+		{	return m_vect.cend();
+		}
+
+		inline r_it rbegin()
+		{	return m_vect.rbegin();
+		}
+
+		inline cr_it crbegin() const
+		{	return m_vect.crbegin();
+		}
+
+		inline r_it rend()
+		{	return m_vect.rend();
+		}
+
+		inline cr_it crend() const
+		{	return m_vect.crend();
+		}
+
+		void erase (ulong pos)
+		{	assert (pos < size());
+			m_vect.erase (m_vect.begin() + pos);
+		}
+
+		T& push_back (const T& value)
+		{	m_vect.push_back (value);
+			return m_vect[m_vect.size() - 1];
+		}
+
+		void push_back (const List<T>& vals)
+		{	for (const T& val : vals)
+				push_back (val);
+		}
+
+		bool pop (T& val)
+		{	if (size() == 0)
+				return false;
+
+			val = m_vect[size() - 1];
+			erase (size() - 1);
+			return true;
+		}
+
+		T& operator<< (const T& value)
+		{	return push_back (value);
 		}
-		
-		return -1u;
-	}
-	
-private:
-	std::deque<T> m_vect;
+
+		void operator<< (const List<T>& vals)
+		{	push_back (vals);
+		}
+
+		bool operator>> (T& value)
+		{	return pop (value);
+		}
+
+		List<T> reverse() const
+		{	List<T> rev;
+
+			for (const T& val : c_rev<T> (*this))
+				rev << val;
+
+			return rev;
+		}
+
+		void clear()
+		{	m_vect.clear();
+		}
+
+		void insert (ulong pos, const T& value)
+		{	m_vect.insert (m_vect.begin() + pos, value);
+		}
+
+		void makeUnique()
+		{	// Remove duplicate entries. For this to be effective, the List must be
+			// sorted first.
+			sort();
+			it pos = std::unique (begin(), end());
+			resize (std::distance (begin(), pos));
+		}
+
+		ulong size() const
+		{	return m_vect.size();
+		}
+
+		T& operator[] (ulong n)
+		{	assert (n < size());
+			return m_vect[n];
+		}
+
+		const T& operator[] (ulong n) const
+		{	assert (n < size());
+			return m_vect[n];
+		}
+
+		void resize (std::ptrdiff_t size)
+		{	m_vect.resize (size);
+		}
+
+		void sort()
+		{	std::sort (begin(), end());
+		}
+
+		ulong find (const T& needle)
+		{	ulong i = 0;
+
+		for (const T & hay : *this)
+			{	if (hay == needle)
+					return i;
+
+				i++;
+			}
+
+			return -1u;
+		}
+
+	private:
+		std::deque<T> m_vect;
 };
 
 // =============================================================================
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 // ListReverser (aka rev)
-// 
+//
 // Helper class used to reverse-iterate Lists in range-for-loops.
 // =============================================================================
-template<class T> class ListReverser {
-public:
-	typedef typename List<T>::r_it it;
-	
-	ListReverser (List<T>& vect) {
-		m_vect = &vect;
-	}
-	
-	it begin() {
-		return m_vect->rbegin();
-	}
-	
-	it end() {
-		return m_vect->rend();
-	}
-	
-private:
-	List<T>* m_vect;
+template<class T> class ListReverser
+{	public:
+		typedef typename List<T>::r_it it;
+
+		ListReverser (List<T>& vect)
+		{	m_vect = &vect;
+		}
+
+		it begin()
+		{	return m_vect->rbegin();
+		}
+
+		it end()
+		{	return m_vect->rend();
+		}
+
+	private:
+		List<T>* m_vect;
 };
 
 // =============================================================================
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 // ConstListReverser (aka c_rev)
-// 
+//
 // Like ListReverser, except works on const Lists.
 // =============================================================================
-template<class T> class ConstListReverser {
-public:
-	typedef typename List<T>::cr_it it;
-	
-	ConstListReverser (const List<T>& vect) {
-		m_vect = &vect;
-	}
-	
-	it begin() const {
-		return m_vect->crbegin();
-	}
-	
-	it end() const {
-		return m_vect->crend();
-	}
-	
-private:
-	const List<T>* m_vect;
+template<class T> class ConstListReverser
+{	public:
+		typedef typename List<T>::cr_it it;
+
+		ConstListReverser (const List<T>& vect)
+		{	m_vect = &vect;
+		}
+
+		it begin() const
+		{	return m_vect->crbegin();
+		}
+
+		it end() const
+		{	return m_vect->crend();
+		}
+
+	private:
+		const List<T>* m_vect;
 };
 
 template<class T> using rev = ListReverser<T>;
@@ -340,120 +376,123 @@
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 // StringFormatArg
-// 
+//
 // Converts a given value into a string that can be retrieved with ::value().
 // Used as the argument type to the formatting functions, hence its name.
 // =============================================================================
-class StringFormatArg {
-public:
-	StringFormatArg (const str& v);
-	StringFormatArg (const char& v);
-	StringFormatArg (const uchar& v);
-	StringFormatArg (const qchar& v);
-	
+class StringFormatArg
+{	public:
+		StringFormatArg (const str& v);
+		StringFormatArg (const char& v);
+		StringFormatArg (const uchar& v);
+		StringFormatArg (const qchar& v);
+
 #define NUMERIC_FORMAT_ARG(T,C) \
 	StringFormatArg (const T& v) { \
 		char valstr[32]; \
 		sprintf (valstr, "%" #C, v); \
 		m_val = valstr; \
 	}
-	
-	NUMERIC_FORMAT_ARG (int, d)
-	NUMERIC_FORMAT_ARG (short, d)
-	NUMERIC_FORMAT_ARG (long, ld)
-	NUMERIC_FORMAT_ARG (uint, u)
-	NUMERIC_FORMAT_ARG (ushort, u)
-	NUMERIC_FORMAT_ARG (ulong, lu)
-	
-	StringFormatArg (const float& v);
-	StringFormatArg (const double& v);
-	StringFormatArg (const vertex& v);
-	StringFormatArg (const matrix& v);
-	StringFormatArg (const char* v);
-	StringFormatArg (const StringConfig& v);
-	StringFormatArg (const IntConfig& v);
-	StringFormatArg (const FloatConfig& v);
-	StringFormatArg (const void* v);
-	
-	template<class T> StringFormatArg (const List<T>& v) {
-		m_val = "{ ";
-		
-		uint i = 0;
-		for (const T& it : v) {
-			if (i++)
-				m_val += ", ";
-			
-			StringFormatArg arg (it);
-			m_val += arg.value();
+
+		NUMERIC_FORMAT_ARG (int, d)
+		NUMERIC_FORMAT_ARG (short, d)
+		NUMERIC_FORMAT_ARG (long, ld)
+		NUMERIC_FORMAT_ARG (uint, u)
+		NUMERIC_FORMAT_ARG (ushort, u)
+		NUMERIC_FORMAT_ARG (ulong, lu)
+
+		StringFormatArg (const float& v);
+		StringFormatArg (const double& v);
+		StringFormatArg (const vertex& v);
+		StringFormatArg (const matrix& v);
+		StringFormatArg (const char* v);
+		StringFormatArg (const StringConfig& v);
+		StringFormatArg (const IntConfig& v);
+		StringFormatArg (const FloatConfig& v);
+		StringFormatArg (const void* v);
+
+		template<class T> StringFormatArg (const List<T>& v)
+		{	m_val = "{ ";
+
+			uint i = 0;
+
+		for (const T & it : v)
+			{	if (i++)
+					m_val += ", ";
+
+				StringFormatArg arg (it);
+				m_val += arg.value();
+			}
+
+			if (i)
+				m_val += " ";
+
+			m_val += "}";
 		}
-		
-		if (i)
-			m_val += " ";
-		
-		m_val += "}";
-	}
-	
-	str value() const { return m_val; }
-private:
-	str m_val;
+
+		str value() const
+		{	return m_val;
+		}
+	private:
+		str m_val;
 };
 
 // =============================================================================
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // =============================================================================
 // File
-// 
+//
 // A file interface with simple interface and support for range-for-loops.
 // =============================================================================
-class File {
-private:
-	// Iterator class to enable range-for-loop support. Rough hack.. don't use directly!
-	class iterator {
+class File
+{	private:
+		// Iterator class to enable range-for-loop support. Rough hack.. don't use directly!
+		class iterator
+		{	public:
+				iterator() : m_file (null) {} // end iterator has m_file == null
+				iterator (File* f);
+				void operator++();
+				str  operator*();
+				bool operator== (iterator& other);
+				bool operator!= (iterator& other);
+
+			private:
+				File* m_file;
+				str m_text;
+				bool m_gotdata = false;
+		};
+
 	public:
-		iterator() : m_file (null) {} // end iterator has m_file == null
-		iterator (File* f);
-		void operator++();
-		str  operator*();
-		bool operator== (iterator& other);
-		bool operator!= (iterator& other);
-	
-	private:
-		File* m_file;
-		str m_text;
-		bool m_gotdata = false;
-	};
+		enum OpenType
+		{	Read,
+			Write,
+			Append
+		};
 
-public:
-	enum OpenType {
-		Read,
-		Write,
-		Append
-	};
-	
-	File();
-	File (str path, File::OpenType rtype);
-	File (FILE* fp, File::OpenType rtype);
-	~File();
-	
-	bool         atEnd() const;
-	iterator     begin();
-	void         close();
-	iterator&    end();
-	bool         flush();
-	bool         isNull() const;
-	bool         readLine (str& line);
-	void         rewind();
-	bool         open (FILE* fp, OpenType rtype);
-	bool         open (str path, OpenType rtype, FILE* fp = null);
-	void         write (str msg);
-	
-	bool         operator!() const;
-	operator bool() const;
-	
-private:
-	QFile*       m_file;
-	QTextStream* m_textstream;
-	iterator     m_endIterator;
+		File();
+		File (str path, File::OpenType rtype);
+		File (FILE* fp, File::OpenType rtype);
+		~File();
+
+		bool         atEnd() const;
+		iterator     begin();
+		void         close();
+		iterator&    end();
+		bool         flush();
+		bool         isNull() const;
+		bool         readLine (str& line);
+		void         rewind();
+		bool         open (FILE* fp, OpenType rtype);
+		bool         open (str path, OpenType rtype, FILE* fp = null);
+		void         write (str msg);
+
+		bool         operator!() const;
+		operator bool() const;
+
+	private:
+		QFile*       m_file;
+		QTextStream* m_textstream;
+		iterator     m_endIterator;
 };
 
 // =============================================================================
@@ -462,22 +501,22 @@
 // The bounding box is the box that encompasses a given set of objects.
 // v0 is the minimum vertex, v1 is the maximum vertex.
 // =============================================================================
-class LDBoundingBox {
-	READ_PROPERTY (bool, empty, setEmpty)
+class LDBoundingBox
+{	READ_PROPERTY (bool, empty, setEmpty)
 	READ_PROPERTY (vertex, v0, setV0)
 	READ_PROPERTY (vertex, v1, setV1)
-	
-public:
-	LDBoundingBox();
-	void reset();
-	void calculate();
-	double size() const;
-	void calcObject (LDObject* obj);
-	void calcVertex (const vertex& v);
-	vertex center() const;
-	
-	LDBoundingBox& operator<< (LDObject* obj);
-	LDBoundingBox& operator<< (const vertex& v);
+
+	public:
+		LDBoundingBox();
+		void reset();
+		void calculate();
+		double size() const;
+		void calcObject (LDObject* obj);
+		void calcVertex (const vertex& v);
+		vertex center() const;
+
+		LDBoundingBox& operator<< (LDObject* obj);
+		LDBoundingBox& operator<< (const vertex& v);
 };
 
 // Formatter function
@@ -511,4 +550,4 @@
 
 static const double pi = 3.14159265358979323846;
 
-#endif // TYPES_H
\ No newline at end of file
+#endif // TYPES_H

mercurial