First of all I apologize for the long lead up to such a simplistic question.
I am implementing a class which serves as a very long 1 dimensional index on a space filling curve or the n-tuple representing the Cartesian coordinate that index corresponds to.
class curvePoint { public: friend class curveCalculate; //Construction and Destruction curvePoint(): point(NULL), dimensions(0) {} virtual ~curvePoint(){if(point!=NULL) delete[] point;} //Mutators void convertToIndex(){ if(isTuple()) calc(this); } void convertToTuple(){ if(isIndex()) calc(this); } void setTuple(quint16 *tuple, int size); void setIndex(quint16 *index, int size); void setAlgorithm(curveType alg){algorithm = alg;} //Inspectors bool isIndex(){return current==Index;} bool isTuple(){return current==Tuple;} size_t size(){return dimensions;} quint16 operator[](size_t index); enum curveType{HilbertCurve, ZCurve, GrayCodeCurve}; enum status{Index, Tuple}; private: curveCalculate calc; curveType algorithm; quint16 *point; size_t dimensions; status current; }; (The length of the array pointed to by point is dimensions)
Anyways in the implementation of operator[] I was wondering what the best method to achieve bounds checking is. I want to avoid throwing exceptions if at all possible, and the full range of values is usable for each number in the array so a special value to return in case of an out of bounds error is not possible either;
I was thinking of something like this though implemented in the class definition:
quint16 curvePoint::operator[](size_t index) { return point[ index % dimensions ]; } This makes it so that we never leave the bounds of the array and if well documented I think it would be fine; nevertheless, I am leary of this particular implementation.
Does this look acceptable to others? Is there any other way of doing bounds checking while still satisfying my constraints?
Edit: Calculation of things like Hilbert curves etc are highly messy, messy enough that I do not not want the additional interface for the stl libraries in the way.
Additionally because I will have to convert many thousands of these every time the multidimensional database is queried I do not want the additional cost of the stl function calls in the mix, if at all possible.
I rather like the idea of the assert; but, if I remember correctly that breaks in release builds does it not?
I suppose I can use exceptions, that seems to be what everyone is rooting for, but I am using the Qt libraries and those avoid exceptions for both performance and portability and I was hoping to do the same.