From cb7fbcaf794a634b3fbd58cb726f8db996518d66 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Sat, 4 Mar 2017 21:51:36 +0100
Subject: [PATCH] add unsigned long primitive type binding

---
 alib2common/src/primitive/UnsignedLong.cpp | 97 ++++++++++++++++++++++
 alib2common/src/primitive/UnsignedLong.h   | 86 +++++++++++++++++++
 2 files changed, 183 insertions(+)
 create mode 100644 alib2common/src/primitive/UnsignedLong.cpp
 create mode 100644 alib2common/src/primitive/UnsignedLong.h

diff --git a/alib2common/src/primitive/UnsignedLong.cpp b/alib2common/src/primitive/UnsignedLong.cpp
new file mode 100644
index 0000000000..245439b736
--- /dev/null
+++ b/alib2common/src/primitive/UnsignedLong.cpp
@@ -0,0 +1,97 @@
+/*
+ * UnsignedLong.cpp
+ *
+ *  Created on: Mar 26, 2013
+ *      Author: Jan Travnicek
+ */
+
+#include "UnsignedLong.h"
+#include <sax/FromXMLParserHelper.h>
+#include "Primitive.h"
+#include <object/Object.h>
+
+namespace primitive {
+
+UnsignedLong::UnsignedLong(unsigned long data) : m_data(data) {
+
+}
+
+PrimitiveBase* UnsignedLong::clone() const {
+	return new UnsignedLong(*this);
+}
+
+PrimitiveBase* UnsignedLong::plunder() && {
+	return new UnsignedLong(std::move(*this));
+}
+
+unsigned long UnsignedLong::getData() const {
+	return m_data;
+}
+
+UnsignedLong::operator unsigned long ( ) const {
+	return m_data;
+}
+
+void UnsignedLong::setData(unsigned long data) {
+	this->m_data = data;
+}
+
+int UnsignedLong::compare(const UnsignedLong& other) const {
+	return m_data - other.m_data;
+}
+
+void UnsignedLong::operator>>(std::ostream& out) const {
+	out << "(UnsignedLong " << m_data << ")";
+}
+
+UnsignedLong::operator std::string() const {
+	return std::to_string(m_data);
+}
+
+UnsignedLong UnsignedLong::parse(std::deque<sax::Token>::iterator& input) {
+	return UnsignedLong(parseRaw(input));
+}
+
+unsigned long UnsignedLong::parseRaw(std::deque<sax::Token>::iterator& input) {
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, UnsignedLong::getXmlTagName());
+	unsigned long data = std::from_string < unsigned long > (sax::FromXMLParserHelper::popTokenData(input, sax::Token::TokenType::CHARACTER));
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, UnsignedLong::getXmlTagName());
+	return data;
+}
+
+void UnsignedLong::compose(std::deque<sax::Token>& out) const {
+	compose(out, this->getData());
+}
+
+void UnsignedLong::compose(std::deque<sax::Token>& out, unsigned long primitive) {
+	out.emplace_back(UnsignedLong::getXmlTagName(), sax::Token::TokenType::START_ELEMENT);
+	out.emplace_back(std::to_string(primitive), sax::Token::TokenType::CHARACTER);
+	out.emplace_back(UnsignedLong::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
+}
+
+PrimitiveBase * UnsignedLong::inc() && {
+	m_data++;
+	return NULL;
+}
+
+} /* namespace primitive */
+
+namespace alib {
+
+unsigned long xmlApi<unsigned long>::parse(std::deque<sax::Token>::iterator& input) {
+	return primitive::UnsignedLong::parseRaw(input);
+}
+
+bool xmlApi<unsigned long>::first(const std::deque<sax::Token>::const_iterator& input) {
+	return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, primitive::UnsignedLong::getXmlTagName());
+}
+
+void xmlApi<unsigned long>::compose(std::deque<sax::Token>& output, unsigned long data) {
+	primitive::UnsignedLong::compose(output, data);
+}
+
+auto unsignedLongParserRegister = xmlApi<primitive::Primitive>::ParserRegister<primitive::UnsignedLong>();
+auto unsignedLongParserRegister2 = xmlApi<alib::Object>::ParserRegister<primitive::UnsignedLong>();
+
+} /* namespace alib */
+
diff --git a/alib2common/src/primitive/UnsignedLong.h b/alib2common/src/primitive/UnsignedLong.h
new file mode 100644
index 0000000000..da68b24e9e
--- /dev/null
+++ b/alib2common/src/primitive/UnsignedLong.h
@@ -0,0 +1,86 @@
+/*
+ * UnsignedLong.h
+ *
+ *  Created on: Mar 26, 2013
+ *      Author: Jan Travnicek
+ */
+
+#ifndef PRIMITIVE_UNSIGNED_LONG_H_
+#define PRIMITIVE_UNSIGNED_LONG_H_
+
+#include "PrimitiveBase.h"
+#include <core/xmlApi.hpp>
+
+namespace primitive {
+
+/**
+ * Represents symbol in an alphabet.
+ */
+class UnsignedLong : public PrimitiveBase {
+protected:
+	unsigned long m_data;
+
+public:
+	/**
+	 * Creates new symbol with given name.
+	 * @param symbol name of the symbol
+	 */
+	explicit UnsignedLong ( unsigned long data );
+
+	virtual PrimitiveBase * clone ( ) const;
+
+	virtual PrimitiveBase * plunder ( ) &&;
+
+	/**
+	 * @return name of the symbol
+	 */
+	unsigned long getData ( ) const;
+
+	explicit operator unsigned long ( ) const;
+
+	/**
+	 * sets new content of primitive
+	 */
+	void setData ( unsigned long data );
+
+	virtual int compare ( const ObjectBase & other ) const {
+		if ( std::type_index ( typeid ( * this ) ) == std::type_index ( typeid ( other ) ) ) return this->compare ( ( decltype ( * this ) )other );
+
+		return std::type_index ( typeid ( * this ) ) - std::type_index ( typeid ( other ) );
+	}
+
+	virtual int compare ( const UnsignedLong & other ) const;
+
+	virtual void operator >>( std::ostream & ) const;
+
+	virtual explicit operator std::string ( ) const;
+
+	static const std::string & getXmlTagName() {
+		static std::string xmlTagName = "UnsignedLong";
+
+		return xmlTagName;
+	}
+
+	static UnsignedLong parse ( std::deque < sax::Token >::iterator & input );
+	static unsigned long parseRaw ( std::deque < sax::Token >::iterator & input );
+
+	void compose ( std::deque < sax::Token > & out ) const;
+	static void compose ( std::deque < sax::Token > & out, unsigned long primitive );
+
+	virtual PrimitiveBase * inc ( ) &&;
+};
+
+} /* namespace primitive */
+
+namespace alib {
+
+template < >
+struct xmlApi < unsigned long > {
+	static unsigned long parse ( std::deque < sax::Token >::iterator & input );
+	static bool first ( const std::deque < sax::Token >::const_iterator & input );
+	static void compose ( std::deque < sax::Token > & output, unsigned long data );
+};
+
+} /* namespace alib */
+
+#endif /* PRIMITIVE_UNSIGNED_LONG_H_ */
-- 
GitLab