/**********************************************************************
 *<
	FILE: hierclas.h

	DESCRIPTION: Simple utility class for describing hierarchies

	CREATED BY: Tom Hudson

	HISTORY: Created 3 July 1995

 *>	Copyright (c) 1995, All Rights Reserved.
 **********************************************************************/

#ifndef __HIERCLAS__H
#define __HIERCLAS__H

#define INVALID_HIERARCHY -1

class HierarchyEntry {
	public:
		int data;
		int children;
		HierarchyEntry *parent;
		HierarchyEntry *sibling;
		HierarchyEntry *child;
		TSTR sortKey;
		UtilExport HierarchyEntry();
		UtilExport HierarchyEntry(int d, HierarchyEntry *p, HierarchyEntry *s);
		UtilExport int HierarchyLevel();
		UtilExport void AddChild(int d);
		UtilExport int GetChild(int index);
		int Children() { return children; }
		UtilExport void Sort();
	};

class GenericHierarchy {
	private:
		HierarchyEntry root;
		void FreeTree(HierarchyEntry* start = NULL);
		BOOL isSorted;
		void CopyTree(int parent, HierarchyEntry* ptr);
	public:
		GenericHierarchy() { root = HierarchyEntry(-1,NULL,NULL); isSorted = FALSE; }
		UtilExport ~GenericHierarchy();
		UtilExport void AddEntry(int data, int parent = -1);		// Add one entry, given its parent
		UtilExport int Entries();									// Total number of members in the hierarchy
		UtilExport HierarchyEntry* GetStart() { return root.child; } // Get the first item under the root
		UtilExport HierarchyEntry* FindEntry(int data, HierarchyEntry* start = NULL);
		UtilExport int NumberOfChildren(int data);					// The number of children for this item
		UtilExport int GetChild(int data, int index);				// Get the nth child of this item
		UtilExport void New();										// Clear out the hierarchy tree
		UtilExport void Sort();										// Sort tree by children/siblings
		UtilExport BOOL IsCompatible(GenericHierarchy& hier);		// Are they compatible?
		UtilExport void Dump(HierarchyEntry* start = NULL);			// DebugPrint the tree
		UtilExport GenericHierarchy& operator=(GenericHierarchy& from);	// Copy operator
		UtilExport TSTR& SortKey();									// Get the sort key for the hierarchy
	};

#endif __HIERCLAS__H