diff --git a/alib2data/src/XmlApi.cpp b/alib2data/src/XmlApi.cpp index ce202080db3f417e8a1af0a986cfd880c1a6f70f..7d1093b107f49af1121f0cb6f608592c1c035557 100644 --- a/alib2data/src/XmlApi.cpp +++ b/alib2data/src/XmlApi.cpp @@ -981,6 +981,30 @@ void xmlApi<primitive::Character>::compose(std::list<sax::Token>& output, const ToXMLComposers::primitiveComposer.compose(output, data); } +primitive::Unsigned xmlApi<primitive::Unsigned>::parse(std::list<sax::Token>& input) { + return FromXMLParsers::primitiveParser.parseUnsigned(input); +} + +bool xmlApi<primitive::Unsigned>::first(const std::list<sax::Token>& input) { + return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::PRIMITIVE_UNSIGNED); +} + +void xmlApi<primitive::Unsigned>::compose(std::list<sax::Token>& output, const primitive::Unsigned& data) { + ToXMLComposers::primitiveComposer.compose(output, data); +} + +primitive::Bool xmlApi<primitive::Bool>::parse(std::list<sax::Token>& input) { + return FromXMLParsers::primitiveParser.parseBool(input); +} + +bool xmlApi<primitive::Bool>::first(const std::list<sax::Token>& input) { + return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::PRIMITIVE_BOOL); +} + +void xmlApi<primitive::Bool>::compose(std::list<sax::Token>& output, const primitive::Bool& data) { + ToXMLComposers::primitiveComposer.compose(output, data); +} + char xmlApi<char>::parse(std::list<sax::Token>& input) { return FromXMLParsers::primitiveParser.parseCharacterRaw(input); } @@ -1261,4 +1285,12 @@ void ToXMLComposers::Visit(void* data, const primitive::Character& primitive) co xmlApi<primitive::Character>::compose(*((std::list<sax::Token>*) data), primitive); } +void ToXMLComposers::Visit(void* data, const primitive::Unsigned& primitive) const { + xmlApi<primitive::Unsigned>::compose(*((std::list<sax::Token>*) data), primitive); +} + +void ToXMLComposers::Visit(void* data, const primitive::Bool& primitive) const { + xmlApi<primitive::Bool>::compose(*((std::list<sax::Token>*) data), primitive); +} + } /* namespace alib */ diff --git a/alib2data/src/XmlApi.hpp b/alib2data/src/XmlApi.hpp index c7c9827d368531f1109bdce0e2644751eded6d14..ceda78aafa3c30e7243a4097cdf76c87e12e6d81 100644 --- a/alib2data/src/XmlApi.hpp +++ b/alib2data/src/XmlApi.hpp @@ -668,6 +668,13 @@ struct xmlApi<char> { static void compose(std::list<sax::Token>& output, char data); }; +template<> +struct xmlApi<primitive::Unsigned> { + static primitive::Unsigned parse(std::list<sax::Token>& input); + static bool first(const std::list<sax::Token>& input); + static void compose(std::list<sax::Token>& output, const primitive::Unsigned& data); +}; + template<> struct xmlApi<unsigned> { static unsigned parse(std::list<sax::Token>& input); @@ -675,6 +682,13 @@ struct xmlApi<unsigned> { static void compose(std::list<sax::Token>& output, unsigned data); }; +template<> +struct xmlApi<primitive::Bool> { + static primitive::Bool parse(std::list<sax::Token>& input); + static bool first(const std::list<sax::Token>& input); + static void compose(std::list<sax::Token>& output, const primitive::Bool& data); +}; + template<> struct xmlApi<bool> { static bool parse(std::list<sax::Token>& input); @@ -787,6 +801,8 @@ class ToXMLComposers : public VisitableObjectBase::const_visitor_type { void Visit(void*, const primitive::String& primitive) const; void Visit(void*, const primitive::Integer& primitive) const; void Visit(void*, const primitive::Character& primitive) const; + void Visit(void*, const primitive::Unsigned& primitive) const; + void Visit(void*, const primitive::Bool& primitive) const; public: static const label::LabelToXMLComposer labelComposer; diff --git a/alib2data/src/object/ObjectBase.h b/alib2data/src/object/ObjectBase.h index faf1d566c75be5e4a7ef7e2e37a52ee885a49378..a42e730aa388c3ada574916cd1e813b368132725 100644 --- a/alib2data/src/object/ObjectBase.h +++ b/alib2data/src/object/ObjectBase.h @@ -120,6 +120,8 @@ namespace primitive { class String; class Integer; class Character; +class Unsigned; +class Bool; } @@ -137,7 +139,7 @@ typedef std::acceptor_base<ObjectBase, string::Epsilon, string::LinearString, string::CyclicString, alphabet::StartSymbol, alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::RankedSymbol, alphabet::BarSymbol, alphabet::RankedBarSymbol, alphabet::SubtreeWildcardSymbol, alphabet::SymbolPairSymbol, alphabet::SymbolSetSymbol, alphabet::UniqueSymbol, alphabet::EndSymbol, container::ObjectsSet, container::ObjectsVector, container::ObjectsPair, container::ObjectsMap, - primitive::String, primitive::Integer, primitive::Character + primitive::String, primitive::Integer, primitive::Character, primitive::Unsigned, primitive::Bool > VisitableObjectBase; class ObjectBase : @@ -152,7 +154,7 @@ class ObjectBase : string::Epsilon, string::LinearString, string::CyclicString, alphabet::StartSymbol, alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::RankedSymbol, alphabet::BarSymbol, alphabet::RankedBarSymbol, alphabet::SubtreeWildcardSymbol, alphabet::SymbolPairSymbol, alphabet::SymbolSetSymbol, alphabet::UniqueSymbol, alphabet::EndSymbol, container::ObjectsSet, container::ObjectsVector, container::ObjectsPair, container::ObjectsMap, - primitive::String, primitive::Integer, primitive::Character + primitive::String, primitive::Integer, primitive::Character, primitive::Unsigned, primitive::Bool >, public VisitableObjectBase { }; diff --git a/alib2data/src/primitive/Bool.cpp b/alib2data/src/primitive/Bool.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9f4cbf3feb33e7b445ae70182a2cce8b53de5192 --- /dev/null +++ b/alib2data/src/primitive/Bool.cpp @@ -0,0 +1,41 @@ +/* + * Bool.cpp + * + * Created on: Mar 26, 2013 + * Author: Jan Travnicek + */ + +#include "Bool.h" + +namespace primitive { + +Bool::Bool(bool data) : data(data) { + +} + +PrimitiveBase* Bool::clone() const { + return new Bool(*this); +} + +PrimitiveBase* Bool::plunder() && { + return new Bool(std::move(*this)); +} + +bool Bool::getData() const { + return data; +} + +int Bool::compare(const Bool& other) const { + return data - other.data; +} + +void Bool::operator>>(std::ostream& out) const { + out << "(Bool " << (data ? "true" : "false") << ")"; +} + +Bool::operator std::string() const { + return data ? "true" : "false"; +} + +} /* namespace primitive */ + diff --git a/alib2data/src/primitive/Bool.h b/alib2data/src/primitive/Bool.h new file mode 100644 index 0000000000000000000000000000000000000000..c3dee8ace3663d895f20301cd8eb9cc2fe6962e5 --- /dev/null +++ b/alib2data/src/primitive/Bool.h @@ -0,0 +1,68 @@ +/* + * Bool.h + * + * Created on: Mar 26, 2013 + * Author: Jan Travnicek + */ + +#ifndef PRIMITIVE_BOOL_H_ +#define PRIMITIVE_BOOL_H_ + +#include <ostream> + +#include "PrimitiveBase.h" + +namespace primitive { + +/** + * Represents symbol in an alphabet. + */ +class Bool : public std::acceptor<Bool, VisitablePrimitiveBase, std::acceptor<Bool, alib::VisitableObjectBase, PrimitiveBase> > { +protected: + bool data; + +public: + /** + * Creates new symbol with given name. + * @param symbol name of the symbol + */ + explicit Bool(bool data); + + virtual PrimitiveBase* clone() const; + + virtual PrimitiveBase* plunder() &&; + + /** + * @return name of the symbol + */ + bool getData() const; + + virtual int compare(const ObjectBase& other) const { + return -other.compare(*this); + } + + virtual int compare(const Bool& other) const; + + virtual void operator>>(std::ostream&) const; + + virtual operator std::string() const; + + virtual int selfTypeId() const { + return typeId<Bool>(); + } +}; + +} /* namespace primitive */ + +namespace std { + +template<> +struct compare<primitive::Bool> { + int operator()(const primitive::Bool& first, const primitive::Bool& second) const { + return first.compare(second); + } +}; + +} /* namespace std */ + +#endif /* PRIMITIVE_BOOL_H_ */ diff --git a/alib2data/src/primitive/Integer.cpp b/alib2data/src/primitive/Integer.cpp index 70bc8e335d7768038e6962ad7e18823da3c98130..f79b92af230931309721d26855b97a372a50083d 100644 --- a/alib2data/src/primitive/Integer.cpp +++ b/alib2data/src/primitive/Integer.cpp @@ -2,7 +2,7 @@ * Integer.cpp * * Created on: Mar 26, 2013 - * Author: Jan Travnicek + * Author: Jan Travnicek */ #include "Integer.h" diff --git a/alib2data/src/primitive/Integer.h b/alib2data/src/primitive/Integer.h index 42aedfd0870da3b0f0f9cb91107311fdabd87b69..88ee421be0bea1446f46b6b68692997ac1fded24 100644 --- a/alib2data/src/primitive/Integer.h +++ b/alib2data/src/primitive/Integer.h @@ -42,7 +42,7 @@ public: } virtual int compare(const Integer& other) const; - + virtual void operator>>(std::ostream&) const; virtual operator std::string() const; diff --git a/alib2data/src/primitive/NextPrimitive.cpp b/alib2data/src/primitive/NextPrimitive.cpp index c85c716f353f080dd9c3ec0630b30240a5f5980d..4a77fbb25615a5c1e6cab2cee769ee9d38ee18b2 100644 --- a/alib2data/src/primitive/NextPrimitive.cpp +++ b/alib2data/src/primitive/NextPrimitive.cpp @@ -9,6 +9,8 @@ #include "Integer.h" #include "String.h" #include "Character.h" +#include "Unsigned.h" +#include "Bool.h" #include "../std/itos.h" namespace primitive { @@ -31,6 +33,18 @@ void NextPrimitive::Visit(void* userData, const String& primitive) { out = new Primitive(String(primitive.getData() + '\'')); } +void NextPrimitive::Visit(void* userData, const Unsigned& primitive) { + Primitive* &out = *((Primitive**) userData); + + out = new Primitive(Unsigned(primitive.getData() + 1)); +} + +void NextPrimitive::Visit(void* userData, const Bool& primitive) { + Primitive* &out = *((Primitive**) userData); + + out = new Primitive(Bool(!primitive.getData())); +} + Primitive NextPrimitive::nextPrimitive(const Primitive& primitive) { Primitive* out; primitive.getData().Accept((void*) &out, *this); diff --git a/alib2data/src/primitive/NextPrimitive.h b/alib2data/src/primitive/NextPrimitive.h index 2d5d4d8ae1621af01f9aae4c80d80d3c1607e3bf..aaafb4489175b804a9329c8d5c3a0d4cd5af0b5f 100644 --- a/alib2data/src/primitive/NextPrimitive.h +++ b/alib2data/src/primitive/NextPrimitive.h @@ -21,6 +21,8 @@ class NextPrimitive : public VisitablePrimitiveBase::visitor_type { void Visit(void*, const String& primitive); void Visit(void*, const Integer& primitive); void Visit(void*, const Character& primitive); + void Visit(void*, const Unsigned& primitive); + void Visit(void*, const Bool& primitive); public: /** diff --git a/alib2data/src/primitive/Primitive.cpp b/alib2data/src/primitive/Primitive.cpp index 58082965efb387e5179bac0ca73def9ef42d89d6..24b9f9cf2eb1d00de2d10c7bd3c583919bf1291c 100644 --- a/alib2data/src/primitive/Primitive.cpp +++ b/alib2data/src/primitive/Primitive.cpp @@ -9,6 +9,8 @@ #include "Integer.h" #include "Character.h" #include "String.h" +#include "Unsigned.h" +#include "Bool.h" namespace primitive { @@ -24,5 +26,13 @@ Primitive primitiveFrom(std::string string) { return Primitive { String { string } }; } +Primitive primitiveFrom(unsigned number) { + return Primitive { Unsigned { number } }; +} + +Primitive primitiveFrom(bool value) { + return Primitive { Bool { value } }; +} + } /* namespace primitive */ diff --git a/alib2data/src/primitive/Primitive.h b/alib2data/src/primitive/Primitive.h index 27531cae41a710c9f63677144b12851ccc90ad12..5deca51cede323e818947b0dbc3ec66e707d3af7 100644 --- a/alib2data/src/primitive/Primitive.h +++ b/alib2data/src/primitive/Primitive.h @@ -23,6 +23,8 @@ typedef alib::wrapper<PrimitiveBase> Primitive; Primitive primitiveFrom(int number); Primitive primitiveFrom(char character); Primitive primitiveFrom(std::string string); +Primitive primitiveFrom(unsigned number); +Primitive primitiveFrom(bool value); } /* namespace primitive */ diff --git a/alib2data/src/primitive/PrimitiveBase.h b/alib2data/src/primitive/PrimitiveBase.h index a408eaef254b2ef62254d2c391000adee40b5ecb..8414ce2e7df15739a732887f542f5f1045c574d7 100644 --- a/alib2data/src/primitive/PrimitiveBase.h +++ b/alib2data/src/primitive/PrimitiveBase.h @@ -16,7 +16,7 @@ namespace primitive { class PrimitiveBase; typedef std::acceptor_base<PrimitiveBase, - primitive::String, primitive::Integer, primitive::Character + primitive::String, primitive::Integer, primitive::Character, primitive::Unsigned, primitive::Bool > VisitablePrimitiveBase; /** diff --git a/alib2data/src/primitive/PrimitiveFeatures.h b/alib2data/src/primitive/PrimitiveFeatures.h index e06afdefb86da84cfbcd0b4ad829de9b5bde168d..2aec1a3b52f6df7002f9c5aebb3cc754577da827 100644 --- a/alib2data/src/primitive/PrimitiveFeatures.h +++ b/alib2data/src/primitive/PrimitiveFeatures.h @@ -13,7 +13,9 @@ namespace primitive { enum class FEATURES { STRING, CHAR, - INTEGER + INTEGER, + UNSIGNED, + BOOL }; } /* namespace primitive */ diff --git a/alib2data/src/primitive/PrimitiveFromXMLParser.cpp b/alib2data/src/primitive/PrimitiveFromXMLParser.cpp index bf4278b94da06f13c26be49ebe91b8587d546ba8..04605a9b385ce04729112201b555ea87d1b196ce 100644 --- a/alib2data/src/primitive/PrimitiveFromXMLParser.cpp +++ b/alib2data/src/primitive/PrimitiveFromXMLParser.cpp @@ -28,13 +28,19 @@ Primitive PrimitiveFromXMLParser::parsePrimitive(std::list<sax::Token>& input, c } else if(alib::xmlApi<Character>::first(input)) { if(!features.count(FEATURES::CHAR)) throw exception::AlibException(); return Primitive(parseCharacter(input)); + } else if(alib::xmlApi<Unsigned>::first(input)) { + if(!features.count(FEATURES::UNSIGNED)) throw exception::AlibException(); + return Primitive(parseUnsigned(input)); + } else if(alib::xmlApi<Bool>::first(input)) { + if(!features.count(FEATURES::BOOL)) throw exception::AlibException(); + return Primitive(parseBool(input)); } else { - throw sax::ParserException(sax::Token("Integer, String, Character", sax::Token::TokenType::START_ELEMENT), input.front()); + throw sax::ParserException(sax::Token("Integer, String, Character, Unsigned, Bool", sax::Token::TokenType::START_ELEMENT), input.front()); } } bool PrimitiveFromXMLParser::first(const std::list<sax::Token>& input) const { - if(alib::xmlApi<Integer>::first(input) || alib::xmlApi<String>::first(input) || alib::xmlApi<Character>::first(input)) { + if(alib::xmlApi<Integer>::first(input) || alib::xmlApi<String>::first(input) || alib::xmlApi<Character>::first(input) || alib::xmlApi<Unsigned>::first(input) || alib::xmlApi<Bool>::first(input)) { return true; } else { return false; @@ -62,6 +68,27 @@ String PrimitiveFromXMLParser::parseString(std::list<sax::Token>& input) const { return data; } +Unsigned PrimitiveFromXMLParser::parseUnsigned(std::list<sax::Token>& input) const { + popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::PRIMITIVE_UNSIGNED); + Unsigned data(std::stou(popTokenData(input, sax::Token::TokenType::CHARACTER))); + popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::PRIMITIVE_UNSIGNED); + return data; +} + +Bool PrimitiveFromXMLParser::parseBool(std::list<sax::Token>& input) const { + popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::PRIMITIVE_BOOL); + std::string tmp = popTokenData(input, sax::Token::TokenType::CHARACTER); + bool data; + if(tmp == "true") + data = true; + else if(tmp == "false") + data = false; + else + throw exception::AlibException("Invalid boolean value"); + popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::PRIMITIVE_BOOL); + return Bool(data); +} + int PrimitiveFromXMLParser::parseIntegerRaw(std::list<sax::Token>& input) const { popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::PRIMITIVE_INTEGER); int data = std::stoi(popTokenData(input, sax::Token::TokenType::CHARACTER)); diff --git a/alib2data/src/primitive/PrimitiveFromXMLParser.h b/alib2data/src/primitive/PrimitiveFromXMLParser.h index ea33caba1a9efd0bdbae2797e807db9f6aa93cac..c83f5e976e04857eeb94eb85606eff1ee142622e 100644 --- a/alib2data/src/primitive/PrimitiveFromXMLParser.h +++ b/alib2data/src/primitive/PrimitiveFromXMLParser.h @@ -15,6 +15,8 @@ #include "String.h" #include "Integer.h" #include "Character.h" +#include "Unsigned.h" +#include "Bool.h" #include "../sax/Token.h" namespace alib { @@ -36,6 +38,8 @@ class PrimitiveFromXMLParser : public sax::FromXMLParserHelper { Integer parseInteger(std::list<sax::Token>& input) const; Character parseCharacter(std::list<sax::Token>& input) const; String parseString(std::list<sax::Token>& input) const; + Unsigned parseUnsigned(std::list<sax::Token>& input) const; + Bool parseBool(std::list<sax::Token>& input) const; int parseIntegerRaw(std::list<sax::Token>& input) const; char parseCharacterRaw(std::list<sax::Token>& input) const; diff --git a/alib2data/src/primitive/PrimitiveToStringComposer.cpp b/alib2data/src/primitive/PrimitiveToStringComposer.cpp index abfc428ca997f90f1338faad680d33a35971c2c6..04dbcb4e9fc8c627576d7d3a92aa9a64afc9beb6 100644 --- a/alib2data/src/primitive/PrimitiveToStringComposer.cpp +++ b/alib2data/src/primitive/PrimitiveToStringComposer.cpp @@ -9,6 +9,8 @@ #include "Integer.h" #include "String.h" #include "Character.h" +#include "Unsigned.h" +#include "Bool.h" namespace primitive { @@ -40,6 +42,18 @@ void PrimitiveToStringComposer::Visit(void* userData, const Integer& primitive) out << primitive.getData(); } +void PrimitiveToStringComposer::Visit(void* userData, const Unsigned& primitive) const { + std::ostream &out = *((std::ostream*) userData); + + out << primitive.getData(); +} + +void PrimitiveToStringComposer::Visit(void* userData, const Bool& primitive) const { + std::ostream &out = *((std::ostream*) userData); + + out << (primitive.getData() ? "true" : "false"); +} + void PrimitiveToStringComposer::compose(std::ostream& out, const Primitive& primitive) const { primitive.getData().Accept((void*) &out, *this); } diff --git a/alib2data/src/primitive/PrimitiveToStringComposer.h b/alib2data/src/primitive/PrimitiveToStringComposer.h index ce3106a289574c481fe621525bed19510464fd73..b3a08bf8948c7a91ec5809c3d74d5d0985210b1c 100644 --- a/alib2data/src/primitive/PrimitiveToStringComposer.h +++ b/alib2data/src/primitive/PrimitiveToStringComposer.h @@ -20,6 +20,8 @@ class PrimitiveToStringComposer : public VisitablePrimitiveBase::const_visitor_t void Visit(void*, const Integer& primitive) const; void Visit(void*, const String& primitive) const; void Visit(void*, const Character& primitive) const; + void Visit(void*, const Unsigned& primitive) const; + void Visit(void*, const Bool& primitive) const; public: /** * Prints text representation of Primitive to the output stream. diff --git a/alib2data/src/primitive/PrimitiveToXMLComposer.cpp b/alib2data/src/primitive/PrimitiveToXMLComposer.cpp index dbd38121c7cf3686f122e551000a4449a338d16b..948d0c50882dc87eb593043de8f254cefa10adcd 100644 --- a/alib2data/src/primitive/PrimitiveToXMLComposer.cpp +++ b/alib2data/src/primitive/PrimitiveToXMLComposer.cpp @@ -36,6 +36,21 @@ void PrimitiveToXMLComposer::compose(std::list<sax::Token>& out, const Character out.push_back(sax::Token(alib::Names::PRIMITIVE_CHARACTER, sax::Token::TokenType::END_ELEMENT)); } +void PrimitiveToXMLComposer::compose(std::list<sax::Token>& out, const Unsigned& primitive) const { + out.push_back(sax::Token(alib::Names::PRIMITIVE_UNSIGNED, sax::Token::TokenType::START_ELEMENT)); + out.push_back(sax::Token(std::utos(primitive.getData()), sax::Token::TokenType::CHARACTER)); + out.push_back(sax::Token(alib::Names::PRIMITIVE_UNSIGNED, sax::Token::TokenType::END_ELEMENT)); +} + +void PrimitiveToXMLComposer::compose(std::list<sax::Token>& out, const Bool& primitive) const { + out.push_back(sax::Token(alib::Names::PRIMITIVE_BOOL, sax::Token::TokenType::START_ELEMENT)); + if(primitive.getData()) + out.push_back(sax::Token("true", sax::Token::TokenType::END_ELEMENT)); + else + out.push_back(sax::Token("false", sax::Token::TokenType::END_ELEMENT)); + out.push_back(sax::Token(alib::Names::PRIMITIVE_BOOL, sax::Token::TokenType::END_ELEMENT)); +} + void PrimitiveToXMLComposer::compose(std::list<sax::Token>& out, const String& primitive) const { out.push_back(sax::Token(alib::Names::PRIMITIVE_STRING, sax::Token::TokenType::START_ELEMENT)); out.push_back(sax::Token(primitive.getData(), sax::Token::TokenType::CHARACTER)); diff --git a/alib2data/src/primitive/PrimitiveToXMLComposer.h b/alib2data/src/primitive/PrimitiveToXMLComposer.h index 7fd2bc90bcde97fede10c0d12a8866424b62c56c..4d35fda16ee7ab772ceb6c14c52f58f8d20a1383 100644 --- a/alib2data/src/primitive/PrimitiveToXMLComposer.h +++ b/alib2data/src/primitive/PrimitiveToXMLComposer.h @@ -44,6 +44,8 @@ class PrimitiveToXMLComposer { void compose(std::list<sax::Token>& out, const String& primitive) const; void compose(std::list<sax::Token>& out, const Integer& primitive) const; void compose(std::list<sax::Token>& out, const Character& primitive) const; + void compose(std::list<sax::Token>& out, const Unsigned& primitive) const; + void compose(std::list<sax::Token>& out, const Bool& primitive) const; void compose(std::list<sax::Token>& out, const std::string& primitive) const; void compose(std::list<sax::Token>& out, int primitive) const; diff --git a/alib2data/src/primitive/Unsigned.cpp b/alib2data/src/primitive/Unsigned.cpp new file mode 100644 index 0000000000000000000000000000000000000000..cb477ffa7265cd3774bc0a9ee5ad6647e36409c0 --- /dev/null +++ b/alib2data/src/primitive/Unsigned.cpp @@ -0,0 +1,41 @@ +/* + * Unsigned.cpp + * + * Created on: Mar 26, 2013 + * Author: Jan Travnicek + */ + +#include "Unsigned.h" + +namespace primitive { + +Unsigned::Unsigned(unsigned data) : data(data) { + +} + +PrimitiveBase* Unsigned::clone() const { + return new Unsigned(*this); +} + +PrimitiveBase* Unsigned::plunder() && { + return new Unsigned(std::move(*this)); +} + +unsigned Unsigned::getData() const { + return data; +} + +int Unsigned::compare(const Unsigned& other) const { + return data - other.data; +} + +void Unsigned::operator>>(std::ostream& out) const { + out << "(Unsigned " << data << ")"; +} + +Unsigned::operator std::string() const { + return std::to_string(data); +} + +} /* namespace primitive */ + diff --git a/alib2data/src/primitive/Unsigned.h b/alib2data/src/primitive/Unsigned.h new file mode 100644 index 0000000000000000000000000000000000000000..a6a11d6ad08f68d1b71065c8fd42823213dad1ac --- /dev/null +++ b/alib2data/src/primitive/Unsigned.h @@ -0,0 +1,68 @@ +/* + * Unsigned.h + * + * Created on: Mar 26, 2013 + * Author: Jan Travnicek + */ + +#ifndef PRIMITIVE_UNSIGNED_H_ +#define PRIMITIVE_UNSIGNED_H_ + +#include <ostream> + +#include "PrimitiveBase.h" + +namespace primitive { + +/** + * Represents symbol in an alphabet. + */ +class Unsigned : public std::acceptor<Unsigned, VisitablePrimitiveBase, std::acceptor<Unsigned, alib::VisitableObjectBase, PrimitiveBase> > { +protected: + unsigned data; + +public: + /** + * Creates new symbol with given name. + * @param symbol name of the symbol + */ + explicit Unsigned(unsigned data); + + virtual PrimitiveBase* clone() const; + + virtual PrimitiveBase* plunder() &&; + + /** + * @return name of the symbol + */ + unsigned getData() const; + + virtual int compare(const ObjectBase& other) const { + return -other.compare(*this); + } + + virtual int compare(const Unsigned& other) const; + + virtual void operator>>(std::ostream&) const; + + virtual operator std::string() const; + + virtual int selfTypeId() const { + return typeId<Unsigned>(); + } +}; + +} /* namespace primitive */ + +namespace std { + +template<> +struct compare<primitive::Unsigned> { + int operator()(const primitive::Unsigned& first, const primitive::Unsigned& second) const { + return first.compare(second); + } +}; + +} /* namespace std */ + +#endif /* PRIMITIVE_UNSIGNED_H_ */