#ifndef COMPONENT_H_ #define COMPONENT_H_ #include "SharedRef.h" #include #include class Configurable; class ToolChain; class ConfiguredComponent { public: ConfiguredComponent(const Configurable& UseIn); std::vector& includeDirectories(); std::vector& linkDirectories(); std::vector& linkParts(); std::string toolChain() const; bool includeDebugInformation() const; bool isIncomplete() const; void markIncomplete(); private: std::string ToolName; bool Debug; bool Incomplete; std::vector Includes; std::vector Links; std::vector Objects; }; class Component { public: virtual ~Component() = 0; virtual const std::string& userName() const = 0; virtual SharedPtr configuredFor(const Configurable& UseIn); private: virtual bool matches(SharedPtr CC, const Configurable& UseIn) = 0; virtual SharedPtr discoverFor(const Configurable& UseIn) = 0; virtual SharedPtr readFromSystemConfiguration(const Configurable& UseIn) = 0; virtual void writeSystemConfiguration(SharedPtr CC, const Configurable& UseIn) = 0; virtual std::string uniqueString(const Configurable& UseIn) = 0; std::vector > Instances; std::vector > Failures; }; class HeaderOnlyComponent : public Component { public: HeaderOnlyComponent(const std::string& Name); void addHeader(const std::string& H); const std::string& name() const; virtual const std::string& userName() const; protected: virtual SharedPtr discoverFor(const Configurable& UseIn); virtual SharedPtr readFromSystemConfiguration(const Configurable& UseIn); virtual void writeSystemConfiguration(SharedPtr CC, const Configurable& UseIn); virtual std::string uniqueString(const Configurable& UseIn); private: virtual bool matches(SharedPtr CC, const Configurable& UseIn); bool works(const std::string& IncludeDir); std::string Name; std::vector Headers; }; class LinkComponent : public HeaderOnlyComponent { public: LinkComponent(const std::string& Name, const std::string& Stem); const std::string& stem() const; virtual const std::string& userName() const; protected: virtual SharedPtr readFromSystemConfiguration(const Configurable& UseIn); virtual void writeSystemConfiguration(SharedPtr CC, const Configurable& UseIn); virtual bool matches(SharedPtr CC, const Configurable& UseIn); virtual SharedPtr discoverFor(const Configurable& UseIn); virtual std::string uniqueString(const Configurable& UseIn); private: bool linkWorks(SharedPtr Tools, const Configurable& UseIn, const std::string& LibDir); virtual std::string adornedStem(SharedPtr Tools, const Configurable& UseIn); std::string Stem; }; SharedPtr createComponentFromName(const std::string& Name); #endif