compare lists

compares two lists. If items are missing, adds "" to the list.

Download comparelists.zip

Synopsis:

comparelists.h
comparelists.cpp
comparelists_test.cpp


comparelists.h

Synopsis
#pragma once
#include <string>
#include <list>
using std::list;
using std::string;

typedef list<string> StringList;
class comparelists
  {
  public :
    comparelists();
    void compare(StringList& leftlist, StringList& rightlist);

  private:
    bool ListsAreEmpty(StringList& leftlist, StringList& rightlist);
    void Initialize();
    void CheckForMissingItems();
    void InsertMissingIntoRight();
    void InsertMissingIntoLeft();
    int CompareLeftToRight();
    bool IsLeftDone();
    bool IsRightDone();

    StringList* mLeftList;
    StringList* mRightList;
    StringList::iterator mLeftIndex;
    StringList::iterator mRightIndex;
  } ;

comparelists.cpp

Synopsis
#include "comparelists.h"
static const string cMissingEntry = "<missing>";

comparelists::comparelists() : mLeftList(0), mRightList(0)
  {
  }
void comparelists::compare(StringList& leftlist, StringList& rightlist)
  {
  if (ListsAreEmpty(leftlist, rightlist)) return;

  mLeftList = &leftlist;
  mRightList = &rightlist;

  Initialize();
  while(!IsLeftDone() || !IsRightDone() )
    CheckForMissingItems();
  }
bool comparelists::ListsAreEmpty(StringList& leftlist, StringList& rightlist)
  {
  if (leftlist.size() == 0 || rightlist.size() == 0) return true;
  return false;
  }
void comparelists::Initialize()
  {
  //because of the sorts, you can not call compare() twice in a row
  mLeftList->sort();
  mRightList->sort();

  mLeftIndex = mLeftList->begin();
  mRightIndex = mRightList->begin();
  }
void comparelists::CheckForMissingItems()
  {
  int cmp = CompareLeftToRight();
  if (cmp < 0)
    {
    InsertMissingIntoRight();
    ++mLeftIndex;
    }
  else if (cmp > 0)
    {
    InsertMissingIntoLeft();
    ++mRightIndex;
    }
  else
    {
    ++mLeftIndex;
    ++mRightIndex;
    }
  }
void comparelists::InsertMissingIntoRight()
  {
  mRightList->insert(mRightIndex, cMissingEntry);
  }
void comparelists::InsertMissingIntoLeft()
  {
  mLeftList->insert(mLeftIndex, cMissingEntry);
  }
int comparelists::CompareLeftToRight()
  {
  if (IsRightDone()) return -1;
  if (IsLeftDone()) return 1;
  return (*mLeftIndex).compare(*mRightIndex);
  }
bool comparelists::IsLeftDone()
  {
  return mLeftIndex == mLeftList->end();
  }
bool comparelists::IsRightDone()
  {
  return mRightIndex == mRightList->end();
  }

comparelists_test.cpp

Synopsis
#define NODEBUGNEW
#include "utx.h"

#include "comparelists.h"
using namespace std;

inline void _utxAssert(const StringList& actual, const StringList& expected, char* fname, const long lineno)
  {
  _utxAssert2((long) actual.size(), (long) expected.size(), fname, lineno, "StringList sizes");

  StringList::const_iterator itActual = actual.begin();
  StringList::const_iterator itExpected = expected.begin();
  while(itActual != actual.end() && itExpected != expected.end())
    {
    _utxAssert2(*itActual, *itExpected, fname, lineno, "items do not match");

    ++itActual;
    ++itExpected;
    }
  }

inline void _utxAssertNot(const StringList& actual, const StringList& expected, char* fname, const long lineno)
  {
  if (actual.size() != expected.size()) return;

  StringList::const_iterator itActual = actual.begin();
  StringList::const_iterator itExpected = expected.begin();
  long mismatches = 0;
  while(itActual != actual.end() && itExpected != expected.end())
    {
    if (*itActual != *itExpected) mismatches++;

    ++itActual;
    ++itExpected;
    }
  if (mismatches != 0) return;
  _utxAssert2(mismatches, -1L, fname, lineno, string("all items match"));
  }

static comparelists mCompare;

//TEST(nulllists)
//  {
//  try 
//    {
//    mCompare.compare(0, 0);
//    } 
//  catch (Exception )
//    {
//    utxassert("0 lists", false);
//    }
//  }
TEST(emptylists)
  {
  StringList list1;
  StringList list2;
  try 
    {
    mCompare.compare(list1, list2);
    } 
  catch (exception /*ex*/)
    {
    utxassert("empty lists", false);
    }
  utxassert(list1, list2);
  }
TEST(happypath)
  {
  StringList listres;
  listres.push_back("a");
  listres.push_back("b");
  listres.push_back("c");
  StringList list1 = listres;
  StringList list2 = listres;
  mCompare.compare(list1, list2);
  utxassert(list1, list2);
  utxassert(list1, listres);
  utxassert(list2, listres);
  }
TEST(missingfromlist1_longer)
  {
  StringList list1;
  list1.push_back("a");
  list1.push_back("b");
  StringList list2;
  list2.push_back("a");
  StringList list1res;
  list1res.push_back("a");
  list1res.push_back("b");
  StringList list2res;
  list2res.push_back("a");
  list2res.push_back("<missing>");
  mCompare.compare(list1, list2);
  utxassertnot(list1, list2);
  utxassert(list1, list1res);
  utxassert(list2, list2res);
  }
TEST(missingfromlist2_longer)
  {
  StringList list1;
  list1.push_back("a");
  StringList list2;
  list2.push_back("a");
  list2.push_back("b");
  StringList list1res;
  list1res.push_back("a");
  list1res.push_back("<missing>");
  StringList list2res;
  list2res.push_back("a");
  list2res.push_back("b");
  mCompare.compare(list1, list2);
  utxassertnot(list1, list2);
  utxassert(list1, list1res);
  utxassert(list2, list2res);
  }
TEST(missingfromlist1_first)
  {
  StringList list1;
  list1.push_back("b");
  list1.push_back("c");
  StringList list2;
  list2.push_back("a");
  list2.push_back("b");
  list2.push_back("c");
  StringList list1res;
  list1res.push_back("<missing>");
  list1res.push_back("b");
  list1res.push_back("c");
  StringList list2res;
  list2res.push_back("a");
  list2res.push_back("b");
  list2res.push_back("c");
  mCompare.compare(list1, list2);
  utxassertnot(list1, list2);
  utxassert(list1, list1res);
  utxassert(list2, list2res);
  }
  TEST(missingfromlist1_middle)
  {
    StringList list1res;
    list1res.push_back("a");
    list1res.push_back("<missing>");
    list1res.push_back("c");
    StringList list2res;
    list2res.push_back("a");
    list2res.push_back("b");
    list2res.push_back("c");
    StringList list1;
    list1.push_back("a");
    list1.push_back("c");
    StringList list2;
    list2.push_back("a");
    list2.push_back("b");
    list2.push_back("c");
    mCompare.compare(list1, list2);
    utxassertnot(list1, list2);
    utxassert(list1, list1res);
    utxassert(list2, list2res);
  }
  TEST(missingfromlist1_last)
  {
    StringList list1;
    list1.push_back("a");
    list1.push_back("b");
    StringList list2;
    list2.push_back("a");
    list2.push_back("b");
    list2.push_back("c");
    StringList list1res;
    list1res.push_back("a");
    list1res.push_back("b");
    list1res.push_back("<missing>");
    StringList list2res;
    list2res.push_back("a");
    list2res.push_back("b");
    list2res.push_back("c");
    mCompare.compare(list1, list2);
    utxassertnot(list1, list2);
    utxassert(list1, list1res);
    utxassert(list2, list2res);
  }
  TEST(missingfromlist2_first)
  {
    StringList list1;
    list1.push_back("a");
    list1.push_back("b");
    list1.push_back("c");
    StringList list2;
    list2.push_back("b");
    list2.push_back("c");
    StringList list1res;
    list1res.push_back("a");
    list1res.push_back("b");
    list1res.push_back("c");
    StringList list2res;
    list2res.push_back("<missing>");
    list2res.push_back("b");
    list2res.push_back("c");
    mCompare.compare(list1, list2);
    utxassert(list1.size(), list2.size());
    utxassertnot(list1, list2);
    utxassert(list1, list1res);
    utxassert(list2, list2res);
  }
  TEST(missingfromlist2_middle)
  {
    StringList list1;
    list1.push_back("a");
    list1.push_back("b");
    list1.push_back("c");
    StringList list2;
    list2.push_back("a");
    list2.push_back("c");
    StringList list1res;
    list1res.push_back("a");
    list1res.push_back("b");
    list1res.push_back("c");
    StringList list2res;
    list2res.push_back("a");
    list2res.push_back("<missing>");
    list2res.push_back("c");
    mCompare.compare(list1, list2);
    utxassert(list1.size(), list2.size());
    utxassertnot(list1, list2);
    utxassert(list1, list1res);
    utxassert(list2, list2res);
  }
  TEST(missingfromlist2_last)
  {
    StringList list1;
    list1.push_back("a");
    list1.push_back("b");
    list1.push_back("c");
    StringList list2;
    list2.push_back("a");
    list2.push_back("b");
    StringList list1res;
    list1res.push_back("a");
    list1res.push_back("b");
    list1res.push_back("c");
    StringList list2res;
    list2res.push_back("a");
    list2res.push_back("b");
    list2res.push_back("<missing>");
    mCompare.compare(list1, list2);
    utxassert(list1.size(), list2.size());
    utxassertnot(list1, list2);
    utxassert(list1, list1res);
    utxassert(list2, list2res);
  }
  TEST(missingfromboth)
  {
    StringList list1;
    list1.push_back("a");
    list1.push_back("c");
    StringList list2;
    list2.push_back("a");
    list2.push_back("b");
    list2.push_back("d");
    StringList list1res;
    list1res.push_back("a");
    list1res.push_back("<missing>");
    list1res.push_back("c");
    list1res.push_back("<missing>");
    StringList list2res;
    list2res.push_back("a");
    list2res.push_back("b");
    list2res.push_back("<missing>");
    list2res.push_back("d");
    mCompare.compare(list1, list2);
    utxassert(list1.size(), list2.size());
    utxassertnot(list1, list2);
    utxassert(list1, list1res);
    utxassert(list2, list2res);
  }






Contact me about content on this page using john_web-at-arrizza-dot-com
For Web Master or site problems contact: webadmin-at-arrizza-dot-com
Copyright John Arrizza (c) 2001,2002,2003,2004,2005,2006,2007