#pragma once
#include "dll_macro.h"
#include "HardwareType.h"
#include "Identifier.h"
#include <string>
#include <memory>
#include <vector>
class Sensor;
class Visitor;
struct innerHardware;
class DLL_API Hardware {
public:
    Hardware(std::shared_ptr<innerHardware> inner);
    Hardware(const Hardware& src);
    bool isNull() const;
    Hardware operator=(const Hardware& src) const{
        return Hardware(src);
    }
    bool operator==(const Hardware& other) const;
    HardwareType getHardwareType();
    std::vector<Sensor> getSensors();
    Hardware getParent();
    std::vector<Hardware> getSubHardware();
    void Update();
    std::string Name();
    std::string GetReport();
    void Accept(Visitor* visitor);
    void Traverse(Visitor* visitor);
    Identifier getIdenifier();
    ~Hardware();
private:
    std::shared_ptr<innerHardware> inner;
};
