Extended Array Template Like CArray

Environment: Generic. Tested on Windows 2000 and Windows Me

CExtendedArray<TYPE, NUM_SORTFLDS, FLDTYPE>

This template implements an abstract MFC style class and provides additional functionality of sorting the data internally over NUM_SORTFLDS simultaneously. Also, class provides ability to search for a given value over these fields quickly, (using binary search) implemented over the sorted fields. It depends on MFC template classes (afxtempl.h) to provide global functions like ConstructElement etc.... If you do not wish to use MFC at all, uncomment all of the functions from top of the file.

It is an abstract class and client must two CompareElem functions. Both of this functions compare two supplied elements and return negative, zero or positive number depending upon whether first element is "less than", "equal to" or "greater than" second element respectively. Only difference between two functions is that in one version, it provides references to two TYPE elements, whereas the second version, passes reference to type and FLDTYPE value.

TYPE

is a data type of object that the CExtArray template will store a pointer to I have done away with ARG_TYPE present in MFC class and all references to object are either converted to a pointer or reference Also, although you can use any field in TYPE, class really becomes useful, when TYPE is a pointer to structure or a class

NUM_SORTFLDS

is a integer value that defines number of fields within the structure, for which you want ability to search and sort data.

FLTDTYPE

is type of field that can be sorted. Only possible value that can make sense here is "void *" or LPARAM. I deliberated a lot on this and cannot think of any other type to use. Send me your comments if you come up with something better. It is basically a place holder that is used while calling CompareElem function.

Sample usage of CExtendedArray<> is as follows:

class something
{
  public:
      char    ApplId[4];
      char    szApplName[81];
};

typedef something* LPSOMESTR;

class MyArray : public CExtendedArray<LPSOMESTR, 2, LPARAM>
{
  int CompareElem(int nSortFld, 
                  LPSOMESTR& first, 
                  LPSOMESTR& second, 
                  LPARAM lHint)
  {
    int r;
    if (nSortFld == 0)
    {
      r = lstrcmpi(first->szApplName, second->szApplName);
      //std::cerr << "Comparing " << first->szApplName 
      //   << " :with: " << second->szApplName 
      //   << "<->" << r << std::endl;
      return r;
    }
    else if (nSortFld == 1)
    {
      return lstrcmpi(first->ApplId , second->ApplId);
      //std::cerr << "Comparing " << first->ApplId 
      // << " :with: " << second->ApplId 
      // << "<->" << r << std::endl;
      return r;
    }

    return 0;
  };

  int CompareElem(int nSortFld, LPSOMESTR& first, 
                  LPARAM valLookup, LPARAM lHint)
  {
    int r;
    if (nSortFld == 0)
    {
      r = lstrcmpi(first->szApplName, (LPCTSTR)valLookup);
      std::cerr << "Comparing " << first->szApplName 
                << " :with: " << (LPCTSTR)valLookup 
                << "<->" << r << std::endl;
      return r;
    }
    else if (nSortFld == 1)
    {
      r = lstrcmpi(first->ApplId , (LPCTSTR)valLookup);
      std::cerr << "Comparing " << first->ApplId 
                << " :with: " << (LPCTSTR)valLookup 
                << "<->" << r << std::endl;
      return r;
    }

    return 0;
  };
};

void testinit()
{
    MyArray wordArray;
    MyArray wordArray2;
    MyArray wordArray3;

    LPSOMESTR w;

    wordArray.SetSize(3,3);

    for (int i = 0; i < 3; i++)
    {
        w = new something;
        // fill in w
        wordArray[i] = w;
    }

    wordArray.SortData(0, 0); // szApplName

    wordArray.SortData(1, 0); // APPL
    LPSOMESTR retVal = NULL;

    if (wordArray.Lookup(1, (LPARAM)"EXT", retVal, 0))
        std::cout << retVal->szApplName << std::endl;

    retVal = NULL;

    if (wordArray.Lookup(1, (LPARAM)"OTH", retVal, 0))
        std::cout << retVal->szApplName << std::endl;
    else
        std::cout << "Not found" << std::endl;
}

Downloads

Download source - 6 Kb


Comments

  • There are no comments yet. Be the first to comment!

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Bonita BPM 7 is here! And for you, an in-depth tour of its innovation. In this webinar, we'll guide you through the brand-new features of this release and demonstrate them live. You will: Discover how business application implementation and maintenance is now even easier, with decoupling of process logic, business data and user interface Learn how to create "living applications" for business processes which present business data in custom views We recommend that you watch the half-hour recording of our …

  • Do you spend a lot of time thinking about your enemies? Attacker attribution - figuring out who's out to get you - is one of the most important things an organization can do to protect itself.  Because you have no hope of defending yourself if you don't understand who the attackers are. Good news? Every organization isn't targeted by all the attackers. Bad news? No one can identify your potential attackers as well as you. Read this graphics-rich threat summary for 2014 to determine who might be your next …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date