Mana
VM.h
Go to the documentation of this file.
1 
8 #pragma once
9 #include "Buffer.h"
10 #include <bitset>
11 #include <functional>
12 #include <memory>
13 #include <unordered_map>
14 
15 namespace mana
16 {
17  class Actor;
18  class Plugin;
19 
20  class VM final : Noncopyable, public std::enable_shared_from_this<VM>
21  {
22  friend class Actor;
23 
24  static constexpr uint32_t Nil = static_cast<uint32_t>(~0);
25 
26  public:
27  using ExternalFunctionType = std::function<void(const std::shared_ptr<Actor>&)>;
28 
29  public:
30  VM() = default;
31  VM(const VM&) = delete;
32  VM(VM&&) noexcept = delete;
33  VM& operator=(const VM&) = delete;
34  VM& operator=(VM&&) noexcept = delete;
35  ~VM();
36 
37  void LoadPlugin(const std::string& filename);
38  void LoadPlugins(const std::string& directoryName);
39 
40  void RegisterFunction(const std::string& name, const ExternalFunctionType& function);
41 
42  void LoadProgram(const std::string& path);
43  void LoadProgram(const std::shared_ptr<const void>& program);
44  void UnloadProgram();
45 
46  void Restart();
47  bool Run();
48  [[nodiscard]] bool IsRunning() const;
49 
50  void Execute(const std::function<void()>& function);
51 
52  void RequestAll(const int32_t level, const char* actionName, const std::shared_ptr<Actor>& sender) const;
53  bool Request(const int32_t level, const char* actorName, const char* actionName, const std::shared_ptr<Actor>& sender);
54  void YieldAll();
55  [[nodiscard]] const std::shared_ptr<Actor>& GetActor(const char* name);
56  [[nodiscard]] const std::string_view& GetActorName(const std::shared_ptr<Actor>& actor) const;
57  [[nodiscard]] std::shared_ptr<Actor> CloneActor(const std::shared_ptr<Actor>& actor, const char* newName);
58  [[nodiscard]] std::shared_ptr<Actor> CreateActor(const char* name, const char* newName);
59  [[nodiscard]] std::shared_ptr<Actor> CreateActorFromPhantom(const char* name, const char* newName);
60  [[nodiscard]] bool IsInInitAction() const;
61  [[nodiscard]] bool IsFinishInitAction() const;
62 
63  void SetSystemRequest(const bool enable);
64  [[nodiscard]] bool IsSystemRequestEnabled() const;
65 
66  [[nodiscard]] uint32_t GetFrameCounter() const;
67  [[nodiscard]] float_t GetDeltaTime() const;
68  [[nodiscard]] bool IsFrameChanged() const;
69 
70  private:
71  [[nodiscard]] int8_t GetInt8FromMemory(const uint32_t address) const;
72  [[nodiscard]] uint8_t GetUint8FromMemory(const uint32_t address) const;
73  [[nodiscard]] int16_t GetInt16FromMemory(const uint32_t address) const;
74  [[nodiscard]] uint16_t GetUint16FromMemory(const uint32_t address) const;
75  [[nodiscard]] int32_t GetInt32FromMemory(const uint32_t address) const;
76  [[nodiscard]] uint32_t GetUint32FromMemory(const uint32_t address) const;
77  [[nodiscard]] float GetFloatFromMemory(const uint32_t address) const;
78  [[nodiscard]] const char* GetStringFromMemory(const uint32_t address) const;
79  //[[nodiscard]] char* GetStringFromData(const uint32_t address);
80  [[nodiscard]] int32_t GetOpecode(const uint32_t address) const;
81 
82  private:
83  [[nodiscard]] ExternalFunctionType FindFunction(const std::string& functionName) const;
84  [[nodiscard]] Buffer& GetGlobalVariables() noexcept;
85  [[nodiscard]] const Buffer& GetGlobalVariables() const noexcept;
86  [[nodiscard]] Buffer& GetStaticVariables() noexcept;
87  [[nodiscard]] const Buffer& GetStaticVariables() const noexcept;
88 
89  private:
90  std::shared_ptr<Plugin> mPlugin;
91  std::shared_ptr<const void> mProgram;
92  const FileHeader* mFileHeader = nullptr;
93  const uint8_t* mInstructionPool = nullptr;
94  const char* mConstantPool = nullptr;
95  //std::vector<,*> m,Array; //!< , オブジェクトへの配列
96  std::unordered_map<std::string, ExternalFunctionType> mFunctionHash;
97  std::unordered_map<std::string_view, std::shared_ptr<Actor>> mActorHash;
98  std::unordered_map<std::string_view, const ActorInfoHeader*> mPhantomHash;
99  Buffer mGlobalVariables;
100  Buffer mStaticVariables;
101 
102  uint32_t mFrameCounter = 0;
103  enum Flag : uint8_t
104  {
105  DebugMode,
106  FrameChanged,
107  InitializeActionRunning,
108  InitializeActionFinished,
109  Initialized,
110  Requested,
111  EnableSystemRequest
112  };
113  std::bitset<8> mFlag;
114  };
115 }
116 
117 #include "VM.inl"
Definition: Actor.h:29
Definition: Buffer.h:17
Definition: Plugin.h:19
Definition: VM.h:21
void YieldAll()
Definition: VM.inl:304
const std::string_view & GetActorName(const std::shared_ptr< Actor > &actor) const
Definition: VM.inl:317
bool Request(const int32_t level, const char *actorName, const char *actionName, const std::shared_ptr< Actor > &sender)
Definition: VM.inl:296
void RequestAll(const int32_t level, const char *actionName, const std::shared_ptr< Actor > &sender) const
Definition: VM.inl:288
void Execute(const std::function< void()> &function)
Definition: VM.inl:280
std::shared_ptr< Actor > CloneActor(const std::shared_ptr< Actor > &actor, const char *newName)
Definition: VM.inl:332
bool IsFinishInitAction() const
Definition: VM.inl:485
std::shared_ptr< Actor > CreateActor(const char *name, const char *newName)
Definition: VM.inl:345
VM(const VM &)=delete
void SetSystemRequest(const bool enable)
Definition: VM.inl:490
bool IsSystemRequestEnabled() const
Definition: VM.inl:498
uint32_t GetFrameCounter() const
Definition: VM.inl:503
bool IsRunning() const
Definition: VM.inl:267
const std::shared_ptr< Actor > & GetActor(const char *name)
Definition: VM.inl:312
void Restart()
Definition: VM.inl:219
void UnloadProgram()
Definition: VM.inl:187
void LoadPlugins(const std::string &directoryName)
Definition: VM.inl:25
void LoadProgram(const std::string &path)
Definition: VM.inl:47
std::shared_ptr< Actor > CreateActorFromPhantom(const char *name, const char *newName)
Definition: VM.inl:350
bool Run()
Definition: VM.inl:230
float_t GetDeltaTime() const
VM(VM &&) noexcept=delete
bool IsInInitAction() const
Definition: VM.inl:480
std::function< void(const std::shared_ptr< Actor > &)> ExternalFunctionType
Definition: VM.h:27
void LoadPlugin(const std::string &filename)
Definition: VM.inl:18
bool IsFrameChanged() const
Definition: VM.inl:508
VM()=default
void RegisterFunction(const std::string &name, const ExternalFunctionType &function)
Definition: VM.inl:32
Definition: CodeBuffer.cpp:12
float float_t
Definition: Type.h:28
Definition: FileFormat.h:54
Definition: FileFormat.h:29
Definition: Noncopyable.h:18