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);
42  template <class T>
43  void RegisterMemberFunction(const std::string& name, T* instance, void (T::*method)(const std::shared_ptr<Actor>&));
44  template <class T>
45  void RegisterMemberFunction(const std::string& name, const T* instance, void (T::*method)(const std::shared_ptr<Actor>&) const);
46  template <class T>
47  void RegisterMemberFunction(const std::string& name, const std::shared_ptr<T>& instance, void (T::*method)(const std::shared_ptr<Actor>&));
48  template <class T>
49  void RegisterMemberFunction(const std::string& name, const std::shared_ptr<T>& instance, void (T::*method)(const std::shared_ptr<Actor>&) const);
50  template <class T>
51  void RegisterMemberFunction(const std::string& name, const std::weak_ptr<T>& instance, void (T::*method)(const std::shared_ptr<Actor>&));
52  template <class T>
53  void RegisterMemberFunction(const std::string& name, const std::weak_ptr<T>& instance, void (T::*method)(const std::shared_ptr<Actor>&) const);
54 
55  void LoadProgram(const std::string& path);
56  void LoadProgram(const std::shared_ptr<const void>& program);
57  void UnloadProgram();
58 
59  void Restart();
60  bool Run();
61  [[nodiscard]] bool IsRunning() const;
62 
63  void Execute(const std::function<void()>& function);
64 
65  void RequestAll(const int32_t level, const char* actionName, const std::shared_ptr<Actor>& sender) const;
66  bool Request(const int32_t level, const char* actorName, const char* actionName, const std::shared_ptr<Actor>& sender);
67  void YieldAll() const;
68  [[nodiscard]] std::shared_ptr<Actor> FindActor(const char* name);
69  [[nodiscard]] std::string_view GetActorName(const std::shared_ptr<Actor>& actor) const;
70  [[nodiscard]] std::shared_ptr<Actor> CloneActor(const std::shared_ptr<Actor>& actor, const char* newName);
71  [[nodiscard]] std::shared_ptr<Actor> CreateActor(const char* name, const char* newName);
72  [[nodiscard]] std::shared_ptr<Actor> CreateActorFromPhantom(const char* name, const char* newName);
73  [[nodiscard]] bool IsInInitAction() const;
74  [[nodiscard]] bool IsFinishInitAction() const;
75 
76  void SetSystemRequest(const bool enable);
77  [[nodiscard]] bool IsSystemRequestEnabled() const;
78 
79  [[nodiscard]] uint32_t GetFrameCounter() const;
80  [[nodiscard]] float_t GetDeltaTime() const;
81  [[nodiscard]] bool IsFrameChanged() const;
82 
83  private:
84  [[nodiscard]] int8_t GetInt8FromMemory(const uint32_t address) const;
85  [[nodiscard]] uint8_t GetUint8FromMemory(const uint32_t address) const;
86  [[nodiscard]] int16_t GetInt16FromMemory(const uint32_t address) const;
87  [[nodiscard]] uint16_t GetUint16FromMemory(const uint32_t address) const;
88  [[nodiscard]] int32_t GetInt32FromMemory(const uint32_t address) const;
89  [[nodiscard]] uint32_t GetUint32FromMemory(const uint32_t address) const;
90  [[nodiscard]] float GetFloatFromMemory(const uint32_t address) const;
91  [[nodiscard]] const char* GetStringFromMemory(const uint32_t address) const;
92  //[[nodiscard]] char* GetStringFromData(const uint32_t address);
93  [[nodiscard]] int32_t GetOpecode(const uint32_t address) const;
94 
95  private:
96  [[nodiscard]] ExternalFunctionType FindFunction(const std::string& functionName) const;
97  [[nodiscard]] Buffer& GetGlobalVariables() noexcept;
98  [[nodiscard]] const Buffer& GetGlobalVariables() const noexcept;
99  [[nodiscard]] Buffer& GetStaticVariables() noexcept;
100  [[nodiscard]] const Buffer& GetStaticVariables() const noexcept;
101 
102  private:
103  std::shared_ptr<Plugin> mPlugin;
104  std::shared_ptr<const void> mProgram;
105  const FileHeader* mFileHeader = nullptr;
106  const uint8_t* mInstructionPool = nullptr;
107  const char* mConstantPool = nullptr;
108  //std::vector<,*> m,Array; //!< , オブジェクトへの配列
109  std::unordered_map<std::string, ExternalFunctionType> mFunctions;
110  std::unordered_map<std::string_view, std::shared_ptr<Actor>> mActors;
111  std::unordered_map<std::string_view, const ActorInfoHeader*> mPhantoms;
112  Buffer mGlobalVariables;
113  Buffer mStaticVariables;
114 
115  uint32_t mFrameCounter = 0;
116  enum Flag : uint8_t
117  {
118  DebugMode,
119  FrameChanged,
120  InitializeActionRunning,
121  InitializeActionFinished,
122  Initialized,
123  Requested,
124  EnableSystemRequest
125  };
126  std::bitset<8> mFlag;
127  };
128 }
129 
130 #include "VM.inl"
Definition: Actor.h:26
Definition: Buffer.h:17
Definition: Plugin.h:19
Definition: VM.h:21
bool Request(const int32_t level, const char *actorName, const char *actionName, const std::shared_ptr< Actor > &sender)
Definition: VM.inl:373
void RequestAll(const int32_t level, const char *actionName, const std::shared_ptr< Actor > &sender) const
Definition: VM.inl:365
void Execute(const std::function< void()> &function)
Definition: VM.inl:357
std::shared_ptr< Actor > CloneActor(const std::shared_ptr< Actor > &actor, const char *newName)
Definition: VM.inl:415
bool IsFinishInitAction() const
Definition: VM.inl:560
std::shared_ptr< Actor > CreateActor(const char *name, const char *newName)
Definition: VM.inl:428
VM(const VM &)=delete
std::string_view GetActorName(const std::shared_ptr< Actor > &actor) const
Definition: VM.inl:402
void SetSystemRequest(const bool enable)
Definition: VM.inl:565
bool IsSystemRequestEnabled() const
Definition: VM.inl:573
uint32_t GetFrameCounter() const
Definition: VM.inl:578
void RegisterMemberFunction(const std::string &name, T *instance, void(T::*method)(const std::shared_ptr< Actor > &))
Register C++ member functions without writing a manual wrapper. The method signature must match Exter...
Definition: VM.inl:38
bool IsRunning() const
Definition: VM.inl:344
void Restart()
Definition: VM.inl:296
void UnloadProgram()
Definition: VM.inl:264
void LoadPlugins(const std::string &directoryName)
Definition: VM.inl:25
void LoadProgram(const std::string &path)
Definition: VM.inl:117
std::shared_ptr< Actor > CreateActorFromPhantom(const char *name, const char *newName)
Definition: VM.inl:433
bool Run()
Definition: VM.inl:307
float_t GetDeltaTime() const
VM(VM &&) noexcept=delete
bool IsInInitAction() const
Definition: VM.inl:555
std::function< void(const std::shared_ptr< Actor > &)> ExternalFunctionType
Definition: VM.h:27
void YieldAll() const
Definition: VM.inl:386
std::shared_ptr< Actor > FindActor(const char *name)
Definition: VM.inl:394
void LoadPlugin(const std::string &filename)
Definition: VM.inl:18
bool IsFrameChanged() const
Definition: VM.inl:583
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:27
Definition: FileFormat.h:53
Definition: FileFormat.h:28
Definition: Noncopyable.h:18