Monday, February 17, 2014

Back to the pre-wheel epoch

Ever thought why so many people adore C++, and so many execrate it at the same time ? Well, actually I don't know, but I guess it has something to do with it's elemental power, wild beasty nature and unpredictable manner.And no, I'm not going into that weird 'pro-grammers' humor like for example -
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." by the god-father Bjarne Stroustrup, or
"Writing in C or C++ is like running a chain saw with all the safety guards removed," , or
"C(++) is a write-only, high-level assembler language." or even this :
"C++ : Hard to learn and built to stay that way !!" , and this :
"How C++ is like teenage sex:

  • It is on everyone's mind all the time. 
  • Everyone talks about it all the time. 
  • Everyone thinks everyone else is doing it. 
  • Almost no one is really doing it. 
  • The few who are doing it are: A. Doing it poorly. B. Sure it will be better next time. C. Not practicing it safely."

Most people think that some of the coolest feature of C++ is it's templates.They are increasingly found to be powerful instruments for the development of cleaner, faster and smarter software. Indeed, templates have become the corner stone of several new C++ programming paradigms.Templates are very useful when implementing generic constructs like vectors, stacks, lists, queues which can be used with any arbitrary type. C++ templates provide a way to re-use source code as opposed to inheritance and composition which provide a way to re-use object code.
Ok , that's great, but i would say that actually the good'old C macros are just as cool as C++ templates. Generic programming and templates in C ? Yes it's pretty much possible, with a bit of macros involved :) Here's an example i wrote to test my wheel reinvention deduction.It's a basic attempt to replace the C++ STL vector<> container.
Sorry about the code formatting.

#define VECTOR(type) struct type##_Vector \
{  public :  type *pArray;  int len;  type illegal; \
  type##_Vector() {   len = 0;   pArray = NULL; }; \ 
 void ClearAll()  {    memset(pArray, 0, sizeof(type) * len); \
   len = 0;  };    void Erase()  {    if(pArray != NULL) \
     free(pArray);    len = 0;    pArray = NULL;  }; \
  int push_back(type Data)  {  \
    type* pTmp = (type*)malloc(sizeof(type) * len + sizeof(type) ); \
      if(pTmp == NULL)        return -1; \    
 memcpy(pTmp, pArray, sizeof(type) * len);      free(pArray); \
      pArray = pTmp;    pArray[len] = Data;    return len++;  }; \ 
   void SetItemAt(int pos, type data) \  
 {    if((pos > -1) && (pos <= len))  \
   {      pArray[pos] = data;    }  } \
   type GetItemAt(int pos)  {    if((pos > -1) && (pos <= len)) \
      return pArray[pos];    return illegal; \
 } \

} 


int main(int argc, char* argv[])
{
VECTOR(int) v;
v.push_back(14);
v.push_back(77);

class test {
public :
char name[64];
test(){strcpy(name ,"wtf"); };
void setName(char* Name){strcpy(name,Name);};
};

VECTOR(test) vtest;

test t;
vtest.push_back(t);
printf(vtest.GetItemAt(0).name);
vtest.Erase();
v.Erase();
return 0;
}

No comments:

Post a Comment