Little trick

29 07 2010

This one’s going to be quick; it’s a little trick I came up with [not that I’m under the impression I’m the first or only one to come up with it].

The trick is to do with defining templated vectors, I’m not actually using it at the moment since I’ve taken to a different route but it struck me as nice enough to post up.

Basically what I had was a BaseData struct which defined a union and was used as both a Matrix base and a Vector base; here’s the code:
template
< const unsigned R
, const unsigned C
, typename T
>
class BaseData
{
  protected:
    union{
      m[R*C];
      mm[R][C];
    };
};

The BaseData iteslf is a bit more complicated obviously, having overloaded operators and constructors but for the sake of clarity.

The first thing I wanted to add to it was the ability to discern between RowMajor and ColMajor matrices [a valid distinction as also noticed recently by a friend of mine on his own blog]

So I’ve quickly whipped up a little enum;
enum MajorOrder
{
  ROW_MAJOR=0,
  COL_MAJOR=1
};

Take a quick note of the values assigned because that’s going to come in handy in a minute.

Now simply add that to the template arguments:
template
< const unsigned R
, const unsigned C
, typename T
, MajorOrder OrderType
>
class BaseData
{
  protected:
    union{
      m[R*C];
      mm[R][C];
    };
};

Matrix, taken care of. But I’m also using it for vectors and those of you with a sharp eye [and you know who you are] probably already noticed a bit of a problem because this setup lets me define a vector using R=3 and C=7 and that’s not a vector at all, is it?

The question, as it turned out, wasn’t too hard to solve, the Vector base class looks like this:
template
< const unsigned D
, typename T
, MajorOrder OrderType
>
class VectorBase : public BaseData<hmm, what goes in here>{};

Whoops, another problem, it’s easy to say a vector can only be defined using a dimension value, but how will that translate into rows and columns? and how to get the compiler [template remember] to figure it all out?

Next on the agenda was to define the relationship between the rows, cols and order type in mathematical terms [remember that order can only be 1 or 0]. Eventually I came up with:
rows=(dimension*order)+(!order);
cols=dimension/rows;

And there you go, compile time decision on how many rows/cols the vector has while allowing me to decide whether I’m using row vectors or column vectors.
template
< const unsigned D
, typename T
, MajorOrder OrderType
>
class VectorBase
: public BaseData
< (D*OrderType)+!OrderType
, D/((D*OrderType)+!OrderType)
, T>{};

Advertisements

Actions

Information

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s




%d bloggers like this: