Source of ArrayBag.cpp


  1: //  Created by Frank M. Carrano and Tim Henry.
  2: //  Copyright (c) 2013 __Pearson Education__. All rights reserved.

  4: /** Implementation file for the class ArrayBag.
  5:  @file ArrayBag.cpp */

  7: #include "ArrayBag.h"
  8: #include <cstddef>

 10: template<class ItemType>
 11: ArrayBag<ItemType>::ArrayBag(): itemCount(0), maxItems(DEFAULT_CAPACITY)
 12: {
 13: }  // end default constructor

 15: template<class ItemType>
 16: int ArrayBag<ItemType>::getCurrentSize() const
 17: {
 18:         return itemCount;
 19: }  // end getCurrentSize

 21: template<class ItemType>
 22: bool ArrayBag<ItemType>::isEmpty() const
 23: {
 24:         return itemCount == 0;
 25: }  // end isEmpty

 27: template<class ItemType>
 28: bool ArrayBag<ItemType>::add(const ItemType& newEntry)
 29: {
 30:         bool hasRoomToAdd = (itemCount < maxItems);
 31:         if (hasRoomToAdd)
 32:         {
 33:                 items[itemCount] = newEntry;
 34:                 itemCount++;
 35:         }  // end if
 36:     
 37:         return hasRoomToAdd;
 38: }  // end add

 40: /*
 41: // STUB
 42:  template<class ItemType>
 43:  bool ArrayBag<ItemType>::remove(const ItemType& anEntry)
 44:  {
 45:     return false; // STUB
 46:  }  // end remove
 47: */   
 48:  
 49: template<class ItemType>
 50: bool ArrayBag<ItemType>::remove(const ItemType& anEntry)
 51: {
 52:    int locatedIndex = getIndexOf(anEntry);
 53:         bool canRemoveItem = !isEmpty() && (locatedIndex > -1);
 54:         if (canRemoveItem)
 55:         {
 56:                 itemCount--;
 57:                 items[locatedIndex] = items[itemCount];
 58:         }  // end if
 59:     
 60:         return canRemoveItem;
 61: }  // end remove

 63: /*
 64:  // STUB
 65:  template<class ItemType>
 66:  void ArrayBag<ItemType>::clear()
 67:  {
 68:     // STUB
 69:  }  // end clear
 70: */

 72: template<class ItemType>
 73: void ArrayBag<ItemType>::clear()
 74: {
 75:         itemCount = 0;
 76: }  // end clear

 78: template<class ItemType>
 79: int ArrayBag<ItemType>::getFrequencyOf(const ItemType& anEntry) const
 80: {
 81:    int frequency = 0;
 82:    int curIndex = 0;       // Current array index
 83:    while (curIndex < itemCount)
 84:    {
 85:       if (items[curIndex] == anEntry)
 86:       {
 87:          frequency++;
 88:       }  // end if
 89:       
 90:       curIndex++;          // Increment to next entry
 91:    }  // end while
 92:    
 93:    return frequency;
 94: }  // end getFrequencyOf

 96: template<class ItemType>
 97: bool ArrayBag<ItemType>::contains(const ItemType& anEntry) const
 98: {
 99:         return getIndexOf(anEntry) > -1;
100: }  // end contains

102: /* ALTERNATE 1: First version
103: template<class ItemType>
104: bool ArrayBag<ItemType>::contains(const ItemType& target) const 
105: {
106:    return getFrequencyOf(target) > 0;
107: }  // end contains

109: // ALTERNATE 2: Second version 
110: template<class ItemType>
111: bool ArrayBag<ItemType>::contains(const ItemType& anEntry) const
112: {
113:    bool found = false;
114:    int curIndex = 0;        // Current array index
115:    while (!found && (curIndex < itemCount))
116:    {
117:       if (anEntry == items[curIndex])
118:       {
119:          found = true;
120:       } // end if
121:       
122:       curIndex++;           // Increment to next entry
123:    }  // end while   
124:    
125:    return found;
126: }  // end contains
127: */

129: template<class ItemType>
130: vector<ItemType> ArrayBag<ItemType>::toVector() const
131: {
132:         vector<ItemType> bagContents;
133:         for (int i = 0; i < itemCount; i++)
134:                 bagContents.push_back(items[i]);
135:       
136:    return bagContents;
137: }  // end toVector

139: // private
140: template<class ItemType>
141: int ArrayBag<ItemType>::getIndexOf(const ItemType& target) const
142: {
143:         bool found = false;
144:    int result = -1;
145:    int searchIndex = 0;
146:    
147:    // If the bag is empty, itemCount is zero, so loop is skipped
148:    while (!found && (searchIndex < itemCount))
149:    {
150:       if (items[searchIndex] == target)
151:       {
152:          found = true;
153:          result = searchIndex;
154:       } 
155:       else
156:       {
157:          searchIndex++;
158:       }  // end if
159:    }  // end while
160:    
161:    return result;
162: }  // end getIndexOf