From c8990d05b6cb53388718f4caf05668dc602e636b Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Tue, 9 Aug 2016 13:26:59 +0200
Subject: [PATCH] pair set access

---
 aaccess2/src/PairSetAccess.cpp          | 34 ++++++++++++++++++
 aaccess2/src/PairSetAccess.h            | 25 +++++++++++++
 aaccess2/src/aaccess.cpp                | 47 +++++++++++++++++++++++++
 aaccess2/src/settings/PairSetSettings.h | 38 ++++++++++++++++++++
 4 files changed, 144 insertions(+)
 create mode 100644 aaccess2/src/PairSetAccess.cpp
 create mode 100644 aaccess2/src/PairSetAccess.h
 create mode 100644 aaccess2/src/settings/PairSetSettings.h

diff --git a/aaccess2/src/PairSetAccess.cpp b/aaccess2/src/PairSetAccess.cpp
new file mode 100644
index 0000000000..f441b2e22c
--- /dev/null
+++ b/aaccess2/src/PairSetAccess.cpp
@@ -0,0 +1,34 @@
+/*
+ * PairSetAccess.cpp
+ *
+ *  Created on: 20. 9. 2014
+ *	  Author: Jan Travnicek
+ */
+
+#include "PairSetAccess.h"
+
+#include <factory/XmlDataFactory.hpp>
+#include <container/ObjectsSet.h>
+#include <container/ObjectsMap.h>
+#include <container/ObjectsTuple.h>
+#include <container/ObjectsVector.h>
+#include <container/ObjectsVariant.h>
+#include <container/ObjectsPair.h>
+
+void PairSetAccess::access ( const std::set < std::pair < alib::Object, alib::Object > > & pairSet, const std::set < PairSetSettings::Settings > & settings ) {
+	if ( settings.count ( PairSetSettings::Settings::FIRST ) ) {
+		std::set < alib::Object > res;
+		for ( const std::pair < alib::Object, alib::Object > & pair : pairSet )
+			res.insert ( pair.first );
+		
+		alib::XmlDataFactory::toStdout ( res );
+	}
+
+	if ( settings.count ( PairSetSettings::Settings::SECOND ) ) {
+		std::set < alib::Object > res;
+		for ( const std::pair < alib::Object, alib::Object > & pair : pairSet )
+			res.insert ( pair.second );
+		
+		alib::XmlDataFactory::toStdout ( res );
+	}
+}
diff --git a/aaccess2/src/PairSetAccess.h b/aaccess2/src/PairSetAccess.h
new file mode 100644
index 0000000000..0c8c2c10d8
--- /dev/null
+++ b/aaccess2/src/PairSetAccess.h
@@ -0,0 +1,25 @@
+/*
+ * PairSetAccess.h
+ *
+ *  Created on: 20. 9. 2014
+ *	  Author: Jan Travnicek
+ */
+
+#ifndef PAIR_SET_ACCESS_H_
+#define PAIR_SET_ACCESS_H_
+
+#include <core/multipleDispatch.hpp>
+
+#include <object/Object.h>
+
+#include "settings/PairSetSettings.h"
+#include <set>
+#include <pair>
+
+class PairSetAccess {
+public:
+	static void access ( const std::set < std::pair < alib::Object, alib::Object > > & pairSet, const std::set < PairSetSettings::Settings > & settings );
+
+};
+
+#endif /* PAIR_SET_ACCESS_H_ */
diff --git a/aaccess2/src/aaccess.cpp b/aaccess2/src/aaccess.cpp
index 81449e1b75..096b50ab86 100644
--- a/aaccess2/src/aaccess.cpp
+++ b/aaccess2/src/aaccess.cpp
@@ -20,6 +20,13 @@
 #include "StringAccess.h"
 #include "ExceptionAccess.h"
 #include "TreeAccess.h"
+#include "PairSetAccess.h"
+
+#include <container/ObjectsSet.h>
+#include <container/ObjectsPair.h>
+
+#include <label/LabelSetLabel.h>
+#include <label/LabelPairLabel.h>
 
 int main ( int argc, char * argv[] ) {
 	try {
@@ -89,6 +96,16 @@ int main ( int argc, char * argv[] ) {
 
 		// ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
+		std::vector < std::string > pairSetSettings {
+			PairSetSettings::stringsVector ( )
+		};
+
+		TCLAP::ValuesConstraint < std::string > pairSetPrintingOptionsVals ( pairSetSettings );
+
+		TCLAP::MultiArg < std::string > pairSet ( "", "pairSet", "Access components of set of pairs", false, & pairSetPrintingOptionsVals );
+
+		// ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
+
 		std::vector < TCLAP::Arg * > xorlist;
 		xorlist.push_back ( & automaton );
 		xorlist.push_back ( & grammar );
@@ -96,6 +113,7 @@ int main ( int argc, char * argv[] ) {
 		xorlist.push_back ( & exception );
 		xorlist.push_back ( & string );
 		xorlist.push_back ( & tree );
+		xorlist.push_back ( & pairSet );
 		cmd.xorAdd ( xorlist );
 
 		TCLAP::ValueArg < std::string > file ( "i", "input", "Read from file", false, "-", "file" );
@@ -192,6 +210,35 @@ int main ( int argc, char * argv[] ) {
 			measurements::start ( "Accesss print", measurements::Type::MAIN );
 
 			TreeAccess::access ( tree, settings );
+		} else if ( alib::XmlDataFactory::first < std::set < std::pair < alib::Object, alib::Object > > > ( tokens ) && pairSet.isSet ( ) ) {
+			std::set < PairSetSettings::Settings > settings;
+
+			for ( const std::string & param : pairSet.getValue ( ) )
+				settings.insert ( PairSetSettings::fromString ( param ) );
+
+			std::set < std::pair < alib::Object, alib::Object > > pairSet = alib::XmlDataFactory::fromTokens < std::set < std::pair < alib::Object, alib::Object > > > ( std::move ( tokens ) );
+
+			measurements::end ( );
+			measurements::start ( "Accesss print", measurements::Type::MAIN );
+
+			PairSetAccess::access ( pairSet, settings );
+		} else if ( alib::XmlDataFactory::first < label::LabelSetLabel > ( tokens ) && pairSet.isSet ( ) ) {
+			std::set < PairSetSettings::Settings > settings;
+
+			for ( const std::string & param : pairSet.getValue ( ) )
+				settings.insert ( PairSetSettings::fromString ( param ) );
+
+			std::set < label::Label > labelSet = alib::XmlDataFactory::fromTokens < label::LabelSetLabel > ( std::move ( tokens ) ).getData ( );
+			std::set < std::pair < alib::Object, alib::Object > > pairSet;
+			for ( const label::Label & label : labelSet ) {
+				const label::LabelPairLabel & labelPair = dynamic_cast < const label::LabelPairLabel & > ( label.getData ( ) );
+				pairSet.insert ( std::make_pair ( alib::Object ( labelPair.getData ( ).first.getData ( ) ), alib::Object ( labelPair.getData ( ).second.getData ( ) ) ) );
+			}
+
+			measurements::end ( );
+			measurements::start ( "Accesss print", measurements::Type::MAIN );
+
+			PairSetAccess::access ( pairSet, settings );
 		} else {
 			throw exception::CommonException ( "Input not recognized." );
 		}
diff --git a/aaccess2/src/settings/PairSetSettings.h b/aaccess2/src/settings/PairSetSettings.h
new file mode 100644
index 0000000000..b94d42390b
--- /dev/null
+++ b/aaccess2/src/settings/PairSetSettings.h
@@ -0,0 +1,38 @@
+/*
+ * PairSetSettings.h
+ *
+ *  Created on: 26. 3. 2014
+ *	  Author: Jan Travnicek
+ */
+
+#ifndef __PAIR_SET_SETTINGS_H__
+#define __PAIR_SET_SETTINGS_H__
+
+#include "SettingsHelper.h"
+
+class PairSetEnum {
+public:
+	enum class Settings {
+		FIRST, SECOND, __MAX__
+	};
+
+	static std::string toString ( PairSetEnum::Settings settings ) {
+		switch ( settings ) {
+		case PairSetEnum::Settings::FIRST:
+			return "first";
+
+		case PairSetEnum::Settings::SECOND:
+			return "second";
+
+		case PairSetEnum::Settings::__MAX__:
+			throw exception::CommonException ( "Invalid enumeration" );
+		}
+		throw exception::CommonException ( "Invalid enumeration" );
+	}
+
+};
+
+class PairSetSettings : public PairSetEnum, public EnumClassHelper < PairSetEnum > {
+};
+
+#endif /* __PAIR_SET_SETTINGS_H__ */
-- 
GitLab