Browse Source

readded cache but not tested

meemknight 2 years ago
parent
commit
a03c558e69

+ 2 - 2
Pika/resources/logs.txt

@@ -1,2 +1,2 @@
-#2023-09-08 14:51:34: Created container: SushiViewer
-#2023-09-08 14:51:44: Destroyed continer: SushiViewer #1
+#2023-09-08 15:16:11: Created container: SushiViewer
+#2023-09-08 15:17:40: Destroyed continer: SushiViewer #1

+ 5 - 1
Pika/thirdparty/sushi/include/sushi/sushi.h

@@ -107,6 +107,10 @@ namespace sushi
 		//todo push backs can invalidate data so just recreate the entire cache
 		//todo push backs can invalidate data so just recreate the entire cache
 		std::unordered_multimap<std::string, SushiParent*> cachedData; 
 		std::unordered_multimap<std::string, SushiParent*> cachedData; 
 
 
+		void signalElementToCacheInternl(SushiParent *parent);
+
+		void signalElementToCacheToRemoveInternal(SushiParent *parent);
+
 		//can't search for root
 		//can't search for root
 		SushiParent *genUniqueParent(std::string name);
 		SushiParent *genUniqueParent(std::string name);
 
 
@@ -120,7 +124,7 @@ namespace sushi
 
 
 		bool load(SushyBinaryFormat &data);
 		bool load(SushyBinaryFormat &data);
 
 
-		
+		void regenerateCache();
 	};
 	};
 
 
 
 

+ 63 - 29
Pika/thirdparty/sushi/src/sushi.cpp

@@ -113,26 +113,26 @@ namespace sushi
 #pragma endregion
 #pragma endregion
 
 
 	//todo
 	//todo
-	//void SushyContext::signalElementToCacheInternl(SushiElement el)
-	//{
-	//	if (!el.hasValue())return;
-	//	cachedData.insert({el.getName(), el});
-	//}
-	//
-	//void SushyContext::signalElementToCacheToRemoveInternal(SushiElement el)
-	//{
-	//	if (!el.hasValue())return;
-	//
-	//	auto range = cachedData.equal_range(el.getName());
-	//	for (auto it = range.first; it != range.second; ++it)
-	//	{
-	//		if (it->second.ptr == el.ptr)
-	//		{
-	//			cachedData.erase(it);
-	//			break;
-	//		}
-	//	}
-	//}
+	void SushyContext::signalElementToCacheInternl(SushiParent *parent)
+	{
+		if (!parent)return;
+		cachedData.insert({parent->name, parent});
+	}
+
+	void SushyContext::signalElementToCacheToRemoveInternal(SushiParent *parent)
+	{
+		if (!parent)return;
+	
+		auto range = cachedData.equal_range(parent->name);
+		for (auto it = range.first; it != range.second; ++it)
+		{
+			if (it->second == parent)
+			{
+				cachedData.erase(it);
+				break;
+			}
+		}
+	}
 
 
 	SushiParent *SushyContext::genUniqueParent(std::string name)
 	SushiParent *SushyContext::genUniqueParent(std::string name)
 	{
 	{
@@ -163,13 +163,11 @@ namespace sushi
 	{
 	{
 		if (!el) { return; }
 		if (!el) { return; }
 
 
-		//todo cache
-		//signalElementToCacheToRemoveInternal(el);
+		signalElementToCacheToRemoveInternal(el);
 
 
 		std::strncpy(el->name, newName, sizeof(el->name) - 1);
 		std::strncpy(el->name, newName, sizeof(el->name) - 1);
 
 
-		//todo cache
-		//signalElementToCacheInternl(el);
+		signalElementToCacheInternl(el);
 	}
 	}
 
 
 	unsigned int SushyContext::addParent(
 	unsigned int SushyContext::addParent(
@@ -178,14 +176,32 @@ namespace sushi
 		Transform &transform,
 		Transform &transform,
 		Background &background)
 		Background &background)
 	{
 	{
+
+		for (auto &p : parent.parents)
+		{
+			signalElementToCacheToRemoveInternal(&p);
+		}
+
 		unsigned int id = currentIdCounter++;
 		unsigned int id = currentIdCounter++;
 		parent.addParentInternal(name, transform, background, id);
 		parent.addParentInternal(name, transform, background, id);
+
+		for (auto &p : parent.parents)
+		{
+			signalElementToCacheInternl(&p);
+		}
+
 		return id;
 		return id;
 	}
 	}
 
 
 	bool SushyContext::deleteById(unsigned int id)
 	bool SushyContext::deleteById(unsigned int id)
 	{
 	{
-		return root.deleteByIdInternal(id);
+		if (root.deleteByIdInternal(id))
+		{
+			regenerateCache();
+			return 1;
+		}
+
+		return 0;
 	}
 	}
 
 
 	void SushyContext::createBasicSchene(int baseId, const char *name)
 	void SushyContext::createBasicSchene(int baseId, const char *name)
@@ -305,7 +321,7 @@ namespace sushi
 				orderedElementsIds.erase(orderedElementsIds.begin() + i);
 				orderedElementsIds.erase(orderedElementsIds.begin() + i);
 			}
 			}
 		}
 		}
-
+	
 		for (int i = 0; i < parents.size(); i++)
 		for (int i = 0; i < parents.size(); i++)
 		{
 		{
 			if (parents[i].id == id)
 			if (parents[i].id == id)
@@ -313,13 +329,13 @@ namespace sushi
 				parents.erase(parents.begin() + i);
 				parents.erase(parents.begin() + i);
 				return 1;
 				return 1;
 			}
 			}
-
+	
 			if (parents[i].deleteByIdInternal(id))
 			if (parents[i].deleteByIdInternal(id))
 			{
 			{
 				return 1;
 				return 1;
 			};
 			};
 		}
 		}
-
+	
 		return 0;
 		return 0;
 	}
 	}
 
 
@@ -339,6 +355,25 @@ namespace sushi
 		orderedElementsIds.push_back(id);
 		orderedElementsIds.push_back(id);
 	}
 	}
 
 
+	void traverseToAddToCache(SushyContext &c, SushiParent &p)
+	{
+		for (auto &child : p.parents)
+		{
+			c.cachedData.insert({child.name, &child});
+		}
+
+		for (auto &child : p.parents)
+		{
+			traverseToAddToCache(c, child);
+		}
+	}
+
+	void SushyContext::regenerateCache()
+	{
+		cachedData.clear();
+		traverseToAddToCache(*this, root);
+	}
+
 #pragma region save load
 #pragma region save load
 
 
 	SushyBinaryFormat SushyContext::save()
 	SushyBinaryFormat SushyContext::save()
@@ -466,7 +501,6 @@ namespace sushi
 
 
 		SushiParent *parentToAddTo = &root;
 		SushiParent *parentToAddTo = &root;
 		
 		
-		//todo if no loaded.mainParent we will make a default root
 
 
 		if (!loaded.parents.empty())
 		if (!loaded.parents.empty())
 		{
 		{