protected ItemTrack GetNewItem()
        {
            ItemTrack itemTrack = new ItemTrack();

            itemTrack.Reset();
            return(itemTrack);
        }
        public void AddItem(ItemID itemID)
        {
            int type = GetItemType(itemID.classItem);

            itemID.type = type;
#if UNITY_EDITOR
            PreDebugLog("Adding Item", "Adding for type: ", type, itemID.item);
#endif
            Dictionary <string, ItemTrack> dictionary = GetType(type);
            ItemTrack newTrack = null;
            if (dictionary[LINK_MAP].capacity - dictionary[LINK_MAP].occupiedSpace == 0 && dictionary[LINK_MAP].capacity != -1)
            {
                newTrack = PopItem(type);
            }
            if (newTrack != null)
            {
                newTrack.Reset();
            }
            else
            {
                newTrack = GetNewItem();
            }
            newTrack.itemID = itemID.item;
            newTrack.item   = itemID;
            dictionary.Add(this.counter.ToString(), newTrack);
            newTrack.localNext = this.counter;
            ItemTrack itemTrack = null;
            if (!dictionary.ContainsKey(itemID.item))   //item index not found - New Item in TYPE
            {
                itemTrack = GetNewItem();
                dictionary.Add(itemID.item, itemTrack);
                if (dictionary[LINK_MAP].globalNext == -99 && dictionary[LINK_MAP].globalPrevious == -99)  //first item in TYPE
                {
                    dictionary[LINK_MAP].globalPrevious = this.counter;
                    dictionary[LINK_MAP].globalNext     = this.counter;
                }
                itemTrack.item          = itemID;
                itemTrack.localPrevious = this.counter;
                itemTrack.localNext     = this.counter;
                itemTrack.occupiedSpace = 0;
                itemTrack.capacity      = dictionary[LINK_MAP].capacity;
            }
            else
            {
                itemTrack = dictionary[itemID.item];
            }
            newTrack.localPrevious  = itemTrack.localNext;
            newTrack.globalPrevious = dictionary[LINK_MAP].globalNext;
            newTrack.globalNext     = this.counter;

            newTrack.occupiedSpace = 1; //occupied space is 1 for each item
            newTrack.capacity      = 1; //capacity is 1 for each item

            dictionary[itemTrack.localNext.ToString()].localNext = this.counter;
            dictionary[dictionary[LINK_MAP].globalNext.ToString()].globalNext = this.counter;

            itemTrack.localNext             = this.counter;
            dictionary[LINK_MAP].globalNext = this.counter;

            itemTrack.occupiedSpace++;
            dictionary[LINK_MAP].occupiedSpace++;
#if UNITY_EDITOR
            PostDebugLog("Added Item", type, itemID.item, dictionary);
#endif
            this.counter++;

            if (OnAdd != null)
            {
                OnAdd(itemID);
            }
            if (OnUpdate != null)
            {
                OnUpdate(GetItems(dictionary));
            }
        }