modules.h
No OneTemporary

File Metadata

Created
Wed, Jul 8, 8:05 AM

modules.h

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* File: modules.h
* Author: pgess <v.melnychenko@xreate.org>
*
* Created on July 22, 2017, 5:11 PM
*/
#ifndef MODULES_H
#define MODULES_H
#include "ast.h"
#include <boost/bimap.hpp>
#ifndef FRIENDS_MODULES_TESTS
#define FRIENDS_MODULES_TESTS
#endif
namespace xreate { namespace modules{
/**\brief Cache of already processed modules */
class ModulesRegistry{
public:
const std::string& getModuleNameByHash(unsigned int hash);
unsigned int getModuleHash(const std::string& moduleName);
private:
typedef boost::bimap<std::string, unsigned int> Hash;
Hash __registry;
};
class ModulesSolver;
/**\brief Holds information related to an individual module
* \sa XreateManagerDecoratorModules, ModulesSolver, ModulesRegistry
*/
class ModuleRecord {
FRIENDS_MODULES_TESTS
friend class ModulesSolver;
public:
void addModuleQuery(const Expression& query);
void addControllerPath(const std::string& path);
void addDiscoveryPath(const std::string& path);
void addProperty(const Expression& prop);
private:
std::list<Expression> __queries;
std::list<std::string> __controllers;
std::list<std::string> __discoveries;
std::list<Expression> __properties;
public:
std::string __path;
};
/** \brief Resolves module's requrements
* \sa XreateManagerDecoratorModules, ModuleRecord
*/
class ModulesSolver{
FRIENDS_MODULES_TESTS
public:
ModulesSolver(ModulesRegistry *registry): __registry(registry) {}
/** \brief Loads content of *controllers* into logic program for resolution */
void loadControllers(const ModuleRecord& module);
/** \brief Discovers specified path for existing modules and stores found modules' properties */
void discoverModules(const ModuleRecord& moduleClient);
void extractProperties(const ModuleRecord& module);
void extractRequirements(const ModuleRecord& module);
void add(const std::string& base);
void init(const std::string& programBase, const ModuleRecord& module);
std::list<std::string> run(const ModuleRecord& module);
private:
ModulesRegistry* __registry;
public:
std::ostringstream __program;
};
}} //end namespace xreate::modules
#endif /* MODULES_H */

Event Timeline