DataStream/dataprototype.h

138 lines
4.3 KiB
C++

#ifndef DATAPROTOTYPE_H
#define DATAPROTOTYPE_H
#include <QString>
#include <QList>
class RuntimeItem;
/**
* @brief 实体观察接口
*/
class ItemListener{
public:
virtual ~ItemListener() = default;
virtual void itemHasbeenUpdated(std::shared_ptr<const RuntimeItem> current, std::shared_ptr<const RuntimeItem> previous) = 0;
virtual void memberHasbeenAppended(const RuntimeItem &parent, std::shared_ptr<const RuntimeItem> inst) = 0;
virtual void memberAboutToBeRemove(const RuntimeItem &parent, std::shared_ptr<const RuntimeItem> inst) = 0;
virtual void memberHasbeenReplaced(const RuntimeItem &parent, std::shared_ptr<const RuntimeItem> current, std::shared_ptr<const RuntimeItem> previous) = 0;
};
/**
* @brief 聚合体类型
*/
enum class AssembleType {
DATAS_ASSEMBLE, // 数据聚合体
MODULES_UNIT, // 模块单元
};
/**
* @brief 内存实例接口
*/
class RuntimeItem : public std::enable_shared_from_this<RuntimeItem> {
public:
explicit RuntimeItem(AssembleType t);
explicit RuntimeItem(const RuntimeItem & other);
std::shared_ptr<const RuntimeItem> add(std::shared_ptr<ItemListener> inst) const;
std::shared_ptr<const RuntimeItem> del(std::shared_ptr<ItemListener> inst) const;
void itemNotify(std::function<void(std::shared_ptr<ItemListener>)> proc) const;
AssembleType baseType() const;
virtual qulonglong hashCode() const;
virtual std::shared_ptr<const RuntimeItem> clone() const;
private:
AssembleType type_store;
QList<std::shared_ptr<ItemListener>> listener_collection;
};
/**
* @brief 下行实体访问接口
*/
class DownAccess : public std::enable_shared_from_this<DownAccess>{
public:
explicit DownAccess(std::shared_ptr<const RuntimeItem> peer);
explicit DownAccess(const DownAccess &other);
template<typename T>
std::shared_ptr<const T> typePeer() const {
return std::dynamic_pointer_cast<const T>(itemPeer());
}
std::shared_ptr<const RuntimeItem> itemPeer() const;
QList<std::shared_ptr<const DownAccess>> members() const;
std::shared_ptr<const DownAccess> append(std::shared_ptr<const DownAccess> child_inst) const;
std::shared_ptr<const DownAccess> remove(std::shared_ptr<const DownAccess> child_inst) const;
std::shared_ptr<const DownAccess> replace(std::shared_ptr<const DownAccess> current, std::shared_ptr<const DownAccess> previous) const;
virtual std::shared_ptr<const DownAccess> clone() const;
private:
std::shared_ptr<const RuntimeItem> runtime_item;
QList<std::shared_ptr<const DownAccess>> children_store;
};
/**
* @brief 上行访问接口
*/
class UpAccess : public std::enable_shared_from_this<UpAccess> {
public:
explicit UpAccess(std::shared_ptr<const UpAccess> parent, std::shared_ptr<const DownAccess> down);
explicit UpAccess(const UpAccess &other);
template<typename T>
std::shared_ptr<const T> typePeer() const {
return std::dynamic_pointer_cast<const T>(itemPeer());
}
std::shared_ptr<const DownAccess> downwardPeers() const;
std::shared_ptr<const UpAccess> parent() const;
virtual std::shared_ptr<const UpAccess> clone() const;
private:
std::shared_ptr<const DownAccess> runtime_downward;
std::shared_ptr<const UpAccess> parent_ptr;
};
/**
* @brief 定义数据传输方向
*/
enum class DataOritation {
INPUT, // 引入
OUTPUT, // 输出
CONSUME, // 引入消耗
GENERATE, // 引出生成
UNDEFINED, // 未定义
};
/**
* @brief 数据接口
*/
class TypeTemplate : public RuntimeItem
{
private:
QString name_store = "foo";
QString type_store = "整形";
DataOritation io_type = DataOritation::UNDEFINED;
QHash<qulonglong, std::pair<std::shared_ptr<const TypeTemplate>, QString>> comps_store;
public:
explicit TypeTemplate();
explicit TypeTemplate(const TypeTemplate & other);
QString name() const;
std::shared_ptr<const TypeTemplate> setName(const QString &val) const;
QString type() const;
std::shared_ptr<const TypeTemplate> setType(const QString &val) const;
DataOritation oritation() const;
std::shared_ptr<const TypeTemplate> setOritation(DataOritation t) const;
virtual std::shared_ptr<const RuntimeItem> clone() const;
};
#endif // DATAPROTOTYPE_H