docs: public synchronized int add(Object value)
     throws IdTableFullException
     {
  		if (tc.isEntryEnabled()) SibTr.entry(this, tc, "add", value);
        
        if (value == null) throw new SIErrorException(nls.getFormattedMessage("IDTABLE_INTERNAL_SICJ0050", null, "IDTABLE_INTERNAL_SICJ0050"));  // D226232
        
        int id = 0;
             
        if (highWaterMark < table.length)
        {
           // Can we store the object in any free space at the end of the table?
           id = highWaterMark;
           if (table[id] != null) throw new SIErrorException(nls.getFormattedMessage("IDTABLE_INTERNAL_SICJ0050", null, "IDTABLE_INTERNAL_SICJ0050"));  // D226232
           table[id] = value;
           if (lowestPossibleFree == highWaterMark) ++lowestPossibleFree;
           ++highWaterMark;
        }
        else if (table.length < maxSize)
        {
           // Resize the table if we can
           growTable();
           id = highWaterMark;
           if (table[id] != null) throw new SIErrorException(nls.getFormattedMessage("IDTABLE_INTERNAL_SICJ0050", null, "IDTABLE_INTERNAL_SICJ0050"));  // D226232
           table[id] = value;
           if (lowestPossibleFree == highWaterMark) ++lowestPossibleFree;         
           ++highWaterMark;         
        }
        else
        {
           // Scan for free slot
           id = findFreeSlot();
           if (id == 0) throw new IdTableFullException();
        }
        
  		if (tc.isEntryEnabled()) SibTr.exit(this, tc, "add", ""+id);
        return id;
     }