Skip to content
Snippets Groups Projects
Commit 1bc317e0 authored by Jan Trávníček's avatar Jan Trávníček
Browse files

cyclic string represented as least rotation

parent 9d2f8aff
No related branches found
No related tags found
No related merge requests found
......@@ -33,12 +33,12 @@ CyclicString::CyclicString(std::set<alphabet::Symbol>&& alphabet, std::vector<al
 
CyclicString::CyclicString(const std::vector<alphabet::Symbol>& data) {
alphabet = std::set<alphabet::Symbol>(data.begin(), data.end());
m_Data = data;
setContent(std::move(data));
}
 
CyclicString::CyclicString(std::vector<alphabet::Symbol>&& data) {
alphabet = std::set<alphabet::Symbol>(data.begin(), data.end());
m_Data = std::move(data);
setContent(std::move(data));
}
 
StringBase* CyclicString::clone() const {
......@@ -72,7 +72,8 @@ const std::vector<alphabet::Symbol>& CyclicString::getContent() const {
return this->m_Data;
}
 
void CyclicString::setContent(const std::vector<alphabet::Symbol>& data) {
//serves as both move and copy content setter
void CyclicString::setContent(std::vector<alphabet::Symbol> data) {
std::set<alphabet::Symbol> minimalAlphabet(data.begin(), data.end());
std::set<alphabet::Symbol> unknownSymbols;
std::set_difference(minimalAlphabet.begin(), minimalAlphabet.end(), alphabet.begin(), alphabet.end(), std::inserter(unknownSymbols, unknownSymbols.end()));
......@@ -80,18 +81,13 @@ void CyclicString::setContent(const std::vector<alphabet::Symbol>& data) {
if(unknownSymbols.size() > 0)
throw exception::AlibException("Input symbols not in the alphabet.");
 
this->m_Data = data;
}
void CyclicString::setContent(std::vector<alphabet::Symbol>&& data) {
std::set<alphabet::Symbol> minimalAlphabet(data.begin(), data.end());
std::set<alphabet::Symbol> unknownSymbols;
std::set_difference(minimalAlphabet.begin(), minimalAlphabet.end(), alphabet.begin(), alphabet.end(), std::inserter(unknownSymbols, unknownSymbols.end()));
if(unknownSymbols.size() > 0)
throw exception::AlibException("Input symbols not in the alphabet.");
m_Data = data;
for(unsigned i = 1; i < data.size(); i++) {
data.push_back(std::move(data[0]));
data.erase(data.begin());
 
this->m_Data = std::move(data);
if(m_Data > data) m_Data = data;
}
}
 
bool CyclicString::isEmpty() const {
......@@ -104,7 +100,7 @@ bool CyclicString::operator<(const LinearString& other) const {
}
 
bool CyclicString::operator<(const CyclicString& other) const {
return m_Data < other.m_Data; //TODO pouzit lexicograficky nejmensi rotaci
return m_Data < other.m_Data;
}
 
bool CyclicString::operator<(const Epsilon& other) const {
......@@ -118,7 +114,7 @@ bool CyclicString::operator==(const LinearString& other) const {
}
 
bool CyclicString::operator==(const CyclicString& other) const {
return m_Data == other.m_Data && alphabet == other.getAlphabet(); //TODO pouzit lexikograficky nejmensi rotaci
return m_Data == other.m_Data && alphabet == other.getAlphabet();
}
 
bool CyclicString::operator==(const Epsilon& other) const {
......
......@@ -46,9 +46,7 @@ public:
*/
const std::vector<alphabet::Symbol>& getContent() const;
 
void setContent(const std::vector<alphabet::Symbol>& data);
void setContent(std::vector<alphabet::Symbol>&& data);
void setContent(std::vector<alphabet::Symbol> data);
 
/**
* @return true if string is an empty word (vector length is 0)
......
......@@ -84,18 +84,7 @@ const std::vector<alphabet::Symbol>& LinearString::getContent() const {
return this->m_Data;
}
 
void LinearString::setContent(const std::vector<alphabet::Symbol>& data) {
std::set<alphabet::Symbol> minimalAlphabet(data.begin(), data.end());
std::set<alphabet::Symbol> unknownSymbols;
std::set_difference(minimalAlphabet.begin(), minimalAlphabet.end(), alphabet.begin(), alphabet.end(), std::inserter(unknownSymbols, unknownSymbols.end()));
if(unknownSymbols.size() > 0)
throw exception::AlibException("Input symbols not in the alphabet.");
this->m_Data = data;
}
void LinearString::setContent(std::vector<alphabet::Symbol>&& data) {
void LinearString::setContent(std::vector<alphabet::Symbol> data) {
std::set<alphabet::Symbol> minimalAlphabet(data.begin(), data.end());
std::set<alphabet::Symbol> unknownSymbols;
std::set_difference(minimalAlphabet.begin(), minimalAlphabet.end(), alphabet.begin(), alphabet.end(), std::inserter(unknownSymbols, unknownSymbols.end()));
......
......@@ -54,9 +54,7 @@ public:
*/
const std::vector<alphabet::Symbol>& getContent() const;
 
void setContent(const std::vector<alphabet::Symbol>& data);
void setContent(std::vector<alphabet::Symbol>&& data);
void setContent(std::vector<alphabet::Symbol> data);
 
/**
* @return true if string is an empty word (vector length is 0)
......
......@@ -19,6 +19,7 @@
#include "alphabet/LabeledSymbol.h"
 
#include "label/StringLabel.h"
#include "label/IntegerLabel.h"
#include "label/Label.h"
 
#define CPPUNIT_IMPLY(x, y) CPPUNIT_ASSERT(!(x) || (y))
......@@ -150,3 +151,18 @@ void StringTest::testCompare() {
CPPUNIT_ASSERT(linear == cyclic);
}
 
void StringTest::testCompareCyclic() {
string::CyclicString cyclic1({alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(0)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2))))});
string::CyclicString cyclic2({alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(0))))});
string::CyclicString cyclic3({alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(0)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1))))});
string::CyclicString cyclic4({alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(0))))});
CPPUNIT_ASSERT(cyclic1 == cyclic2);
CPPUNIT_ASSERT(cyclic1 == cyclic3);
CPPUNIT_ASSERT(cyclic2 == cyclic3);
CPPUNIT_ASSERT(cyclic4 != cyclic1);
CPPUNIT_ASSERT(cyclic4 != cyclic2);
CPPUNIT_ASSERT(cyclic4 != cyclic3);
}
......@@ -9,6 +9,7 @@ class StringTest : public CppUnit::TestFixture
CPPUNIT_TEST( testEqual );
CPPUNIT_TEST( testXMLParser );
CPPUNIT_TEST( testCompare );
CPPUNIT_TEST( testCompareCyclic );
CPPUNIT_TEST_SUITE_END();
 
public:
......@@ -19,6 +20,7 @@ public:
void testEqual();
void testXMLParser();
void testCompare();
void testCompareCyclic();
};
 
#endif // STRING_TEST_H_
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment