MxEngine
ComponentFactory.h
1 // Copyright(c) 2019 - 2020, #Momo
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are met :
6 //
7 // 1. Redistributions of source code must retain the above copyright notice, this
8 // list of conditions and the following disclaimer.
9 //
10 // 2. Redistributions in binary form must reproduce the above copyright notice,
11 // this list of conditions and the following disclaimer in the documentation
12 // and /or other materials provided with the distribution.
13 //
14 // 3. Neither the name of the copyright holder nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 // DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 // DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26 // OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 
29 #pragma once
30 
31 #include "Utilities/STL/MxHashMap.h"
32 #include "Utilities/String/String.h"
33 #include "Utilities/AbstractFactory/AbstractFactory.h"
34 #include "Utilities/ECS/ComponentView.h"
35 
36 namespace MxEngine
37 {
39  {
40  static constexpr size_t FactorySize = sizeof(FactoryImpl<char>);
41  public:
42  using FactoryMap = MxHashMap<StringId, std::aligned_storage_t<FactorySize>>;
43  private:
44  inline static FactoryMap* factories = nullptr;
45  public:
46  template<typename T>
47  static FactoryImpl<T>& GetFactory()
48  {
49  if (factories->find(T::ComponentId) == factories->end())
50  {
51  new (&(*factories)[T::ComponentId]) FactoryImpl<T>();
52  }
53  return *reinterpret_cast<FactoryImpl<T>*>(&(*factories)[T::ComponentId]);
54  }
55 
56  template<typename T>
57  static auto& Get()
58  {
59  return GetFactory<T>().template GetPool<T>();
60  }
61 
62  template<typename T>
63  static ComponentView<T> GetView()
64  {
65  return ComponentView{ Get<T>() };
66  }
67 
68  template<typename T, typename... Args>
69  static auto CreateComponent(Args&&... args)
70  {
71  UUID uuid = UUIDGenerator::Get();
72  auto& pool = Get<T>();
73  size_t index = pool.Allocate(uuid, std::forward<Args>(args)...);
74  return Resource<T, ComponentFactory>(uuid, index);
75  }
76 
77  template<typename T>
78  static void Destroy(Resource<T, ComponentFactory>& resource)
79  {
80  Get<T>().Deallocate(resource.GetHandle());
81  }
82 
83  static void Init()
84  {
85  factories = new FactoryMap(); // static data, so dont care about freeing
86  }
87 
88  static FactoryMap* GetImpl()
89  {
90  return factories;
91  }
92 
93  static void Clone(FactoryMap* other)
94  {
95  factories = other;
96  }
97  };
98 
99  template<typename T>
101 }
Definition: AbstractFactory.h:61
Definition: AbstractFactory.h:423
Definition: ComponentView.h:42
Definition: ComponentFactory.h:38
Definition: UUID.h:45
Definition: AbstractFactory.h:399
Definition: Application.cpp:49