public TALLY_ATTEMPT_RESULT tally(int value) {
        TALLY_ATTEMPT_RESULT result;
        switch (compareToValue(value)) {
            case SMALLER:
                result = TALLY_ATTEMPT_RESULT.VALUE_TOO_SMALL;
                break;
            case GREATER:
                result = TALLY_ATTEMPT_RESULT.VALUE_TOO_LARGE;
                break;
            case EQUAL:
            default:
                result = TALLY_ATTEMPT_RESULT.VALUE_APPROPRIATE;
                // convert the value to the value relative to the starting point of this chunk
                int localValue = (int) ((long) value - location);

                boolean incrementAccomplished = false;
                for (int row = 0; row < maxBytesPerTally && !incrementAccomplished; row++) {
                    // make sure that the memory for this row has been allocated
                    if (tallies[row] == null) {
                        tallies[row] = new byte[maxTallies];
                    }

                    // if the value is already maxed out for this row, set it to zero, and increment the value in the next row
                    if (isUnsignedByteMaxed(tallies[row][localValue])) {
                        tallies[row][localValue] = 0;
                    } else {
                        tallies[row][localValue]++;
                        incrementAccomplished = true;
                    }
                }
                break;
        }
        return result;
    }