r3797 - software/ui/src

Miriam Ruiz baby-guest at alioth.debian.org
Thu Aug 23 21:13:53 UTC 2007


Author: baby-guest
Date: 2007-08-23 21:13:53 +0000 (Thu, 23 Aug 2007)
New Revision: 3797

Added:
   software/ui/src/taghandler.cpp
   software/ui/src/taghandler.h
   software/ui/src/taghandler_test.cpp
Log:
Started skeleton for tag filtering



Added: software/ui/src/taghandler.cpp
===================================================================
--- software/ui/src/taghandler.cpp	                        (rev 0)
+++ software/ui/src/taghandler.cpp	2007-08-23 21:13:53 UTC (rev 3797)
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2007  Miriam Ruiz <little_miry at yahoo.es>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include "taghandler.h"
+
+#include <iostream>
+
+FilterTagHandler::FilterTagHandler() : current_position(0), current_flag(1)
+{
+}
+
+FilterTagHandler::~FilterTagHandler()
+{
+}
+
+const FilterTagHandler::Element *FilterTagHandler::GetTag(const std::string name)
+{
+	for (std::vector<Element>::const_iterator i = elements.begin();
+			i != elements.end(); ++i)
+	{ if (i->name == name) return &(*i); }
+	return NULL;
+}
+
+void FilterTagHandler::AddTag(const std::string name)
+{
+	for (std::vector<Element>::const_iterator i = elements.begin();
+			i != elements.end(); ++i)
+	{ if (i->name == name) return; }
+
+	Element tag(name, current_position, current_flag);
+	current_flag = current_flag << 1;
+	if (!current_flag)
+	{ current_position++; current_flag=1; }
+	elements.push_back(tag);
+}
+
+void FilterTagHandler::PrintAll()
+{
+	for (std::vector<Element>::const_iterator i = elements.begin();
+			i != elements.end(); ++i)
+	{
+		std::cerr << i->name << " (" << i->position << ":" << i->flag << ")" << std::endl;
+	}
+}
+
+void FilterTagHandler::Print(Result *result)
+{
+	for (std::vector<Element>::const_iterator i = elements.begin();
+			i != elements.end(); ++i)
+	{
+		if (result->CheckAny(i->position, i->flag))
+			std::cerr << i->name << " ";
+	}
+	std::cerr << std::endl;
+}

Added: software/ui/src/taghandler.h
===================================================================
--- software/ui/src/taghandler.h	                        (rev 0)
+++ software/ui/src/taghandler.h	2007-08-23 21:13:53 UTC (rev 3797)
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2007  Miriam Ruiz <little_miry at yahoo.es>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifndef _games_taghandler_h
+#define _games_taghandler_h
+
+#include <string>
+#include <vector>
+#include <iostream>
+
+class FilterTagHandler
+{
+protected:
+	class Element
+	{
+	public:
+		inline Element(const std::string tag_name, unsigned int tag_position, unsigned int tag_flag)
+		{ name = tag_name; position = tag_position; flag = tag_flag; }
+
+		std::string name;
+		unsigned int position;
+		unsigned int flag;
+	};
+
+public:
+	class Result
+	{
+	public:
+		inline Result()
+		{ size = 1; data = new unsigned int[size]; for (unsigned int i=0; i<size; i++) data[i] = 0; }
+
+		~Result()
+		{ if (data) delete[] data; }
+
+		inline void Clear()
+		{
+			for (unsigned int i=0; i<size; i++) data[i] = 0;
+		}
+
+		inline void SetTag(unsigned int position, unsigned int flag)
+		{
+			Size(position+1);
+			data[position] = data[position] | flag;
+		}
+
+		inline void ResetTag(unsigned int position, unsigned int flag)
+		{
+			Size(position+1);
+			data[position] = data[position] & ~flag;
+		}
+
+		inline bool CheckAny(unsigned int position, unsigned int flag)
+		{
+			Size(position+1);
+			if ((data[position] & flag) != 0) return true;
+			return false;
+		}
+
+		inline bool CheckAll(unsigned int position, unsigned int flag)
+		{
+			Size(position+1);
+			if ((data[position] & flag) == flag) return true;
+			return false;
+		}
+
+		bool CompareAny(const Result &red)
+		{
+			unsigned int min_size = size;
+			if (min_size > red.size) min_size = red.size;
+			for (unsigned int i=0; i<min_size; i++)
+				if ((data[i] & red.data[i]) != 0) return true;
+			return false;
+		}
+
+		bool CompareAll(const Result &green)
+		{
+			unsigned int min_size = size;
+			if (min_size > green.size) min_size = green.size;
+			for (unsigned int i=0; i<min_size; i++)
+				if ((data[i] & green.data[i]) != green.data[i]) return false;
+			if (size >= green.size) return true;
+			for (unsigned int j=size; j<green.size; j++)
+				if (green.data[j] != 0) return false;
+			return true;
+		}
+
+		void Print()
+		{
+			for (unsigned int i=0; i<size; i++)
+				std::cerr << data[i] << " " ;
+			std::cerr << std::endl;
+		}
+
+	protected:
+		void Size(unsigned int new_size)
+		{
+			if (new_size > size)
+			{
+				unsigned int *new_data = new unsigned int[new_size];
+				for (unsigned int i=0; i<new_size; i++) new_data[i] = 0;
+				if (data)
+				{
+					for (unsigned int i=0; i<size; i++) new_data[i] = data[i];
+					delete[] data;
+				}
+				data = new_data;
+				size = new_size;
+			}
+		}
+
+		unsigned int size;
+		unsigned int *data;
+	};
+
+public:
+	FilterTagHandler();
+	~FilterTagHandler();
+
+	const Element *GetTag(const std::string name);
+	void AddTag(const std::string name);
+	void PrintAll();
+	void Print(Result *result);
+
+	inline void Clear()
+	{ elements.clear(); current_position=0; current_flag=1; };
+
+	inline void SetTag(Result *result, const std::string name)
+	{
+		AddTag(name);
+		const Element *e = GetTag(name);
+		result->SetTag(e->position, e->flag);
+	}
+
+	inline void ResetTag(Result *result, const std::string name)
+	{
+		AddTag(name);
+		const Element *e = GetTag(name);
+		result->ResetTag(e->position, e->flag);
+	}
+
+protected:
+	std::vector<Element> elements;
+
+	unsigned int current_position;
+	unsigned int current_flag;
+};
+
+#endif

Added: software/ui/src/taghandler_test.cpp
===================================================================
--- software/ui/src/taghandler_test.cpp	                        (rev 0)
+++ software/ui/src/taghandler_test.cpp	2007-08-23 21:13:53 UTC (rev 3797)
@@ -0,0 +1,70 @@
+#include "taghandler.h"
+
+#include <iostream>
+#include <sstream>
+#include <string>
+
+int main(int argc, const char* argv[])
+{
+	FilterTagHandler tags;
+	for (unsigned int i=0; i<70; i++)
+	{
+		tags.AddTag("A");
+		tags.AddTag("B");
+		tags.AddTag("C");
+		tags.AddTag("D");
+		tags.AddTag("E");
+		tags.AddTag("F");
+		tags.AddTag("G");
+		tags.AddTag("H");
+		tags.AddTag("I");
+		tags.AddTag("J");
+		tags.AddTag("K");
+		tags.AddTag("L");
+		tags.AddTag("LL");
+		tags.AddTag("M");
+		tags.AddTag("N");
+		tags.AddTag("O");
+		tags.AddTag("P");
+		tags.AddTag("Q");
+		tags.AddTag("R");
+		tags.AddTag("S");
+		tags.AddTag("T");
+		tags.AddTag("U");
+		tags.AddTag("V");
+		tags.AddTag("W");
+		tags.AddTag("X");
+		tags.AddTag("Y");
+		tags.AddTag("Z");
+		tags.AddTag("0");
+		tags.AddTag("1");
+		tags.AddTag("2");
+		tags.AddTag("3");
+		tags.AddTag("4");
+		tags.AddTag("5");
+		tags.AddTag("6");
+		tags.AddTag("7");
+		tags.AddTag("8");
+		tags.AddTag("9");
+		tags.AddTag("10");
+	}
+	tags.PrintAll();
+
+
+	FilterTagHandler::Result t1, t2, t3, t4, t5, t6, t7;
+	tags.SetTag(&t1, "A"); tags.SetTag(&t1, "7"); tags.SetTag(&t1, "MIRY");
+	t1.Print();
+	tags.Print(&t1);
+	t1.Print();
+	tags.SetTag(&t2, "A"); tags.SetTag(&t2, "7"); tags.SetTag(&t2, "MIRY");
+	tags.SetTag(&t3, "A"); tags.SetTag(&t3, "8"); tags.SetTag(&t3, "MIRY");
+	tags.SetTag(&t4, "B"); tags.SetTag(&t4, "C");
+	if (t1.CompareAny(t2)) { std::cerr << "Any: t1 == t2" << std::endl; } else { std::cerr << "Any: t1 != t2" << std::endl; }
+	if (t1.CompareAny(t3)) { std::cerr << "Any: t1 == t3" << std::endl; } else { std::cerr << "Any: t1 != t3" << std::endl; }
+	if (t1.CompareAny(t4)) { std::cerr << "Any: t1 == t4" << std::endl; } else { std::cerr << "Any: t1 != t4" << std::endl; }
+	if (t1.CompareAll(t2)) { std::cerr << "All: t1 == t2" << std::endl; } else { std::cerr << "All: t1 != t2" << std::endl; }
+	if (t1.CompareAll(t3)) { std::cerr << "All: t1 == t3" << std::endl; } else { std::cerr << "All: t1 != t3" << std::endl; }
+	if (t1.CompareAll(t4)) { std::cerr << "All: t1 == t4" << std::endl; } else { std::cerr << "All: t1 != t4" << std::endl; }
+
+	return 0;
+}




More information about the Pkg-games-commits mailing list