-
Tomáš Pecka authored
... because most developers were copy-pasting the preambule anyway and did not pay any attention to change it. Also, I think that git does better job in managing that.
Tomáš Pecka authored... because most developers were copy-pasting the preambule anyway and did not pay any attention to change it. Also, I think that git does better job in managing that.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
stringApi.hpp 3.12 KiB
/*
* StringApi.hpp
*/
#pragma once
#include <alib/functional>
#include <alib/list>
#include <alib/map>
#include <alib/string>
#include <alib/memory>
#include <alib/algorithm>
#include <alib/istream>
#include <alib/typeinfo>
#include <alib/algorithm>
#include <object/Object.h>
#include <object/AnyObject.h>
#include "exception/CommonException.h"
namespace core {
template < typename T >
struct stringApi;
template < >
struct stringApi < object::Object > {
public:
class GroupReader {
public:
virtual object::Object parse ( std::istream & input ) = 0;
virtual ~GroupReader ( ) = default;
};
private:
static ext::list < std::pair < std::function < bool ( std::istream & ) >, std::unique_ptr < GroupReader > > > & parseFunctions ( );
template < class Type >
class ReaderRegister : public GroupReader {
public:
~ReaderRegister ( ) override = default;
object::Object parse ( std::istream & input ) override {
return object::Object ( stringApi < Type >::parse ( input ) );
}
};
public:
class GroupWriter {
public:
virtual void compose ( std::ostream & output, const object::Object & group ) = 0;
virtual ~GroupWriter ( ) = default;
};
private:
static ext::map < std::string, std::unique_ptr < GroupWriter > > & composeFunctions ( );
template < class Type >
class WriterRegister : public GroupWriter {
public:
~WriterRegister ( ) override = default;
void compose ( std::ostream & output, const object::Object & group ) override {
stringApi < Type >::compose ( output, static_cast < const object::AnyObject < Type > & > ( group.getData ( ) ).getData ( ) );
}
};
public:
static void unregisterStringReader ( ext::list < std::pair < std::function < bool ( std::istream & ) >, std::unique_ptr < GroupReader > > >::const_iterator iter );
static ext::list < std::pair < std::function < bool ( std::istream & ) >, std::unique_ptr < GroupReader > > >::const_iterator registerStringReader ( std::function < bool ( std::istream & ) > first, std::unique_ptr < GroupReader > entry );
template < class Type >
static ext::list < std::pair < std::function < bool ( std::istream & ) >, std::unique_ptr < GroupReader > > >::const_iterator registerStringReader ( ) {
return registerStringReader ( stringApi < Type >::first, std::unique_ptr < GroupReader > ( new ReaderRegister < Type > ( ) ) );
}
static void unregisterStringWriter ( const std::string & type, const std::string & typeName );
template < class Type >
static void unregisterStringWriter ( ) {
unregisterStringWriter ( ext::to_string < object::AnyObject < Type > > ( ), ext::to_string < Type > ( ) );
}
static void registerStringWriter ( std::string type, const std::string & typeName, std::unique_ptr < GroupWriter > entry );
template < class Type >
static void registerStringWriter ( ) {
registerStringWriter ( ext::to_string < object::AnyObject < Type > > ( ), ext::to_string < Type > ( ), std::unique_ptr < GroupWriter > ( new WriterRegister < Type > ( ) ) );
}
static object::Object parse ( std::istream & input );
static bool first ( std::istream & input );
static void compose ( std::ostream & output, const object::Object & data );
};
} /* namespace core */