
//File Category.h - contains definition of Category class

#ifndef _category_h
#define _category_h

template <class C, class K>
class Category{

public:
	Category(/*const*/ C & aCategory): cat(aCategory){
		//All initialization done in base member initializer list
	}
	Category(const Category<C,K> & aCategory){
		cat = aCategory.cat;
		for(SetIterator<K> keyIterator=aCategory.keys.begin(); keyIterator!=aCategory.keys.end(); ++keyIterator)
			keys.add(*keyIterator);
	}
	~Category(){
		for(SetIterator<K> keyIterator=keys.begin(); keyIterator!=keys.end(); ++keyIterator)
			delete &(*keyIterator);
	}
	Category & addKey(K & aKey){
		keys.add(aKey);
		return *this;
	}
	C & getCategory() /*const*/ {
		return cat;
	}
	Set<K> & getKeys() /*const*/ {
		return keys;
	}
	Category<C,K> & removeKey(const K & aKey){
		keys.remove(aKey);
	}
	bool isEmpty() const {
		if(keys.size() == 0)
			return true;
		return false;
	}
	int size() const {
		return keys.size();
	}
	bool includes(const K & aKey) const {
		return keys.includes(aKey);
	}
	Category<C,K> & operator=(const Category<C,K> & aCategory){
		if(this != &aCategory){
			cat = aCategory.cat;
			for(SetIterator<K> keyIterator=aCategory.keys.begin(); keyIterator!=aCategory.keys.end(); ++keyIterator)
				keys.add(*keyIterator);
		}
		return *this
	}
	bool operator==(Category<C,K> aCategory){
		if(cat == aCategory.cat)
			return true;
		else
			return false;
	}
	void printOn(ostream & ostr) /*const*/ {
		ostr << "Category: " << cat << endl;
		for(SetIterator<K> keyIterator=keys.begin(); keyIterator!=keys.end(); ++keyIterator)
			ostr << "\t" << *keyIterator << endl;
	}

private:
	C cat;
	Set<K> keys;
};

template<class C, class K>
ostream & operator<<(ostream & ostr, /*const*/ Category<C,K> & aCategory) {
	aCategory.printOn(ostr);
	return ostr;
}

#endif