Click here to Skip to main content
15,894,955 members
Articles / Desktop Programming / MFC

The Diffraction Grating Calculator

Rate me:
Please Sign up or sign in to vote.
4.40/5 (5 votes)
30 Oct 2010GPL38 min read 41.5K   678   6  
An MFC Windows program related to Concave Diffraction Gratings using VTK libraries.
#include "StdAfx.h"
#include "ObjectList.h"
#include "GenericObj.h"

CObjectList::CObjectList(UINT32 unInitAllocPtrIdx /* = MIN_ALLOC_SPACE */)
{
   unLastErrorCode = OLIST_ERRCODE_OK;
   pPtrArray = 0;
   unMaxAllocPtrIdx = 0;
   unPtrIdx = 0;
   unLastObjectIdx = 0;

   if(!unInitAllocPtrIdx)
      unInitAllocPtrIdx = MIN_ALLOC_SPACE;

   AllocateMemory(unInitAllocPtrIdx);
   if ( GetLastErrorCode() == OLIST_ERRCODE_OVERFLOW )
      throw;
}

CObjectList::~CObjectList()
{
   if(pPtrArray)
   {
      // now delete array object
      delete [] pPtrArray;
      pPtrArray = 0;
   }
}

void CObjectList::AllocateMemory(UINT32 unRequiredIdx)
{
   if(unRequiredIdx <= unMaxAllocPtrIdx)
      return;

   if(!pPtrArray)
   {
      pPtrArray = new POINTER[unRequiredIdx+MIN_ALLOC_SPACE];
      if(!pPtrArray)
         unLastErrorCode = OLIST_ERRCODE_NEWOBJALLOC;
      ZeroMemory(pPtrArray, sizeof(POINTER));
      unMaxAllocPtrIdx = unRequiredIdx+MIN_ALLOC_SPACE;
      return;
   }

   // re-alloc
   UINT32 unNewMaxAllocPtrIdx = unRequiredIdx + MIN_ALLOC_SPACE;
   if ( unNewMaxAllocPtrIdx >= UINT32_ERR ) // max size
      unNewMaxAllocPtrIdx = UINT32_ERR - MIN_ALLOC_SPACE + 1;
   if ( unRequiredIdx > unNewMaxAllocPtrIdx ) // overflow
   {
      unLastErrorCode = OLIST_ERRCODE_OVERFLOW;
      return;
   }
   POINTER *pNewPtrArray = new POINTER[unNewMaxAllocPtrIdx];
   if(!pNewPtrArray)
      unLastErrorCode = OLIST_ERRCODE_NEWOBJALLOC;
   ZeroMemory(pNewPtrArray, sizeof(POINTER) * unNewMaxAllocPtrIdx);

   // copy previous data
   MoveMemory((void*) pNewPtrArray, (void*) pPtrArray, sizeof(POINTER) * unMaxAllocPtrIdx);

   // delete original array
   delete [] pPtrArray;
   pPtrArray = pNewPtrArray;
   unMaxAllocPtrIdx = unNewMaxAllocPtrIdx;
}

UINT32 CObjectList::GetLastErrorCode(void)
{
   return unLastErrorCode;
}

UINT32 CObjectList::AddObject(POINTER pObject)
{
   AllocateMemory(unPtrIdx+1); // make sure we have enough room
   if ( GetLastErrorCode() == OLIST_ERRCODE_OVERFLOW )
      return UINT32_ERR;
   *(pPtrArray+unPtrIdx) = pObject;
   unLastObjectIdx = unPtrIdx;
   unPtrIdx++;
   return unPtrIdx;
}

UINT32 CObjectList::GetLastObjectIdx(void)
{
   return unLastObjectIdx;
}

UINT32 CObjectList::InsertObject(POINTER pObject, UINT32 unTargPtrIdx)
{
   AllocateMemory(unPtrIdx+1); // make sure we have enough room
   if ( GetLastErrorCode() == OLIST_ERRCODE_OVERFLOW )
      return UINT32_ERR;
   for(UINT32 unAuxPtrIdx = unPtrIdx-1 ; (unAuxPtrIdx < unPtrIdx) && (unAuxPtrIdx >= unTargPtrIdx) ; unAuxPtrIdx--)
      *(pPtrArray+unAuxPtrIdx+1) = *(pPtrArray+unAuxPtrIdx);
   *(pPtrArray+unTargPtrIdx) = pObject;
   unLastObjectIdx = unTargPtrIdx;
   unPtrIdx++;
   return unPtrIdx;
}

UINT32 CObjectList::FindObject(POINTER pObject)
{
   UINT32 unAuxPtrIdx;
   for(unAuxPtrIdx = 0 ; unAuxPtrIdx < unPtrIdx ; unAuxPtrIdx++)
   {
      if(*(pPtrArray+unAuxPtrIdx) == pObject)
         return unAuxPtrIdx;
   }
   return UINT32_ERR;
}

UINT32 CObjectList::DeleteObject(POINTER pObject)
{
   UINT32 unTargPtrIdx;
   unTargPtrIdx = FindObject((POINTER) pObject);
   if(unTargPtrIdx == UINT32_ERR)
      return UINT32_ERR;
   return DeleteObjectIdx(unTargPtrIdx);
}

UINT32 CObjectList::DeleteObjectIdx(UINT32 unTargPtrIdx)
{
   UINT32 unAuxPtrIdx;

   if(unTargPtrIdx >= unPtrIdx)
      unLastErrorCode = OLIST_ERRCODE_ERROBJIDX;

   for(unAuxPtrIdx = unTargPtrIdx ; unAuxPtrIdx < unPtrIdx-1 ; unAuxPtrIdx++)
      *(pPtrArray+unAuxPtrIdx) = *(pPtrArray+unAuxPtrIdx+1);

   unPtrIdx--;
   return unPtrIdx;
}

void CObjectList::SwapItems(UINT32 unIndex_A, UINT32 unIndex_B)
{
   POINTER pAuxPtrArray;
   if(unIndex_A >= unPtrIdx)
      unLastErrorCode = OLIST_ERRCODE_ERROBJIDX;
   if(unIndex_B >= unPtrIdx)
      unLastErrorCode = OLIST_ERRCODE_ERROBJIDX;
   pAuxPtrArray = *(pPtrArray+unIndex_A);
   *(pPtrArray+unIndex_A) = *(pPtrArray+unIndex_B);
   *(pPtrArray+unIndex_B) = pAuxPtrArray;
}

void CObjectList::EraseAllEntries(void)
{
   UINT32 unAuxPtrIdx;

   for(unAuxPtrIdx = 0 ; unAuxPtrIdx < unPtrIdx ; unAuxPtrIdx++)
      *(pPtrArray+unAuxPtrIdx) = 0;

   unPtrIdx = 0;
}

UINT32 CObjectList::GetObjectCount(void)
{
   return unPtrIdx;
}

// get binary size as byte buffers stripped of terminators
UINT32 CObjectList::GetBinStringTotalSize(void)
{
   UINT32 unBinSize  = 0;
   UINT32 unObjCount = GetObjectCount();
   TCHAR* pObj = NULL;

   for ( UINT32 unObj = 0; unObj < unObjCount; unObj++ )
   {
      pObj = NULL;
      pObj = (TCHAR*) GetObjectByIdx(unObj);
      if ( pObj )
      {
#if defined(UNICODE)
         unBinSize += (UINT32) 2 * (_tcslen(pObj));
#else
         unBinSize += (UINT32) _tcslen(pObj);
#endif
      }
   }
   return unBinSize;
}

// get binary size as unknown object
UINT32 CObjectList::GetBinTotalSize(void)
{
   UINT32 unBinSize  = 0;
   UINT32 unObjCount = GetObjectCount();
   POINTER pObj = NULL;

   for ( UINT32 unObj = 0; unObj < unObjCount; unObj++ )
   {
      pObj = NULL;
      pObj = GetObjectByIdx(unObj);
      if ( pObj )
      {
         unBinSize += sizeof(pObj);
      }
   }
   return unBinSize;
}

// get binary size as generic object
UINT32 CObjectList::GetBinGenericTotalSize(void)
{
   UINT32 unBinSize  = 0;
   UINT32 unObjCount = GetObjectCount();
   CGenericObj* pObj = NULL;

   for ( UINT32 unObj = 0; unObj < unObjCount; unObj++ )
   {
      pObj = NULL;
      pObj = (CGenericObj*) GetObjectByIdx(unObj);
      if ( pObj )
      {
         // TODO: see whatever we may need ...
         unBinSize += sizeof(pObj);
      }
   }
   return unBinSize;
}

POINTER CObjectList::GetCurObject(void)
{
   POINTER pObject;

   if(!unPtrIdx)
      return 0;

   pObject = *(pPtrArray+unPtrIdx-1);
   return pObject;
}

POINTER CObjectList::GetObjectByIdx(UINT32 unObjectIdx)
{
   POINTER pObject;

   if(unObjectIdx >= unPtrIdx)
      return NULL;

   pObject = *(pPtrArray+unObjectIdx);
   return pObject;
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The GNU General Public License (GPLv3)


Written By
Software Developer (Senior)
Italy Italy
Senior Software Developer in C/C++ and Oracle.
Ex-physicist holding a Ph.D. on x-ray lasers.

Comments and Discussions