Click here to Skip to main content
15,884,176 members
Articles / Web Development / HTML

Catch All Bugs with BugTrap!

Rate me:
Please Sign up or sign in to vote.
4.34/5 (84 votes)
31 Jan 2009MIT5 min read 1.8M   9.1K   292  
A tool that can catch unhandled errors and exceptions, and deliver error reports to remote support servers
/*
 * This is a part of the BugTrap package.
 * Copyright (c) 2005-2007 IntelleSoft.
 * All rights reserved.
 *
 * Description: Prototypes of collection helpers.
 * Author: Maksim Pyatkovskiy.
 *
 * This source code is only intended as a supplement to the
 * BugTrap package reference and related electronic documentation
 * provided with the product. See these sources for detailed
 * information regarding the BugTrap package.
 */

#pragma once

#include "InPlaceNew.h"
#include "StrHolder.h"
#include "StrStream.h"

/// Object instantiation traits.
template <typename DATA_TYPE>
class CObjectTraits
{
public:
	/// Calls the constructor of @a DATA_TYPE class by default.
	static void Constructor(DATA_TYPE& rData);
	/// Calls the destructor of @a DATA_TYPE class by default.
	static void Destructor(DATA_TYPE& rData);
	/// Calls the assignment operator of @a DATA_TYPE class by default.
	static void Assignment(DATA_TYPE& rDstData, const DATA_TYPE& rSrcData);
};

/**
 * @param rData - reference to the memory placement of new object.
 */
template <typename DATA_TYPE>
inline void CObjectTraits<DATA_TYPE>::Constructor(DATA_TYPE& rData)
{
	::new((void*)&rData) DATA_TYPE;
}

/**
 * @param rData - reference to the memory placement of deleted object.
 */
template <typename DATA_TYPE>
inline void CObjectTraits<DATA_TYPE>::Destructor(DATA_TYPE& rData)
{
	rData; rData.~DATA_TYPE();
}

/**
 * @param rDstData - reference to the memory placement of destination object.
 * @param rSrcData - reference to the memory placement of source object.
 */
template <typename DATA_TYPE>
inline void CObjectTraits<DATA_TYPE>::Assignment(DATA_TYPE& rDstData, const DATA_TYPE& rSrcData)
{
	rDstData = rSrcData;
}

/// Value initialization traits.
template <typename DATA_TYPE, DATA_TYPE value = 0>
class CValueTraits
{
public:
	/// Calls the constructor of @a DATA_TYPE by default.
	static void Constructor(DATA_TYPE& rData);
	/// Calls the destructor of @a DATA_TYPE by default
	static void Destructor(DATA_TYPE& rData);
	/// Calls the assignment operator of @a DATA_TYPE by default.
	static void Assignment(DATA_TYPE& rDstData, const DATA_TYPE& rSrcData);
};

/**
 * @param rData - reference to the memory placement of new object.
 */
template <typename DATA_TYPE, DATA_TYPE value>
inline void CValueTraits<DATA_TYPE, value>::Constructor(DATA_TYPE& rData)
{
	rData = value;
}

/**
 * @param rData - reference to the memory placement of deleted object.
 */
template <typename DATA_TYPE, DATA_TYPE value>
inline void CValueTraits<DATA_TYPE, value>::Destructor(DATA_TYPE& /*rData*/)
{
}

/**
 * @param rDstData - reference to the memory placement of destination object.
 * @param rSrcData - reference to the memory placement of source object.
 */
template <typename DATA_TYPE, DATA_TYPE value>
inline void CValueTraits<DATA_TYPE, value>::Assignment(DATA_TYPE& rDstData, const DATA_TYPE& rSrcData)
{
	rDstData = rSrcData;
}

/// Dynamic instantiation traits.
template <typename DATA_TYPE>
class CDynamicTraits
{
public:
	/// Calls the constructor of @a DATA_TYPE class by default.
	static void Constructor(DATA_TYPE& rData);
	/// Calls the destructor of @a DATA_TYPE class by default.
	static void Destructor(DATA_TYPE& rData);
	/// Calls the assignment operator of @a DATA_TYPE class by default.
	static void Assignment(DATA_TYPE& rDstData, const DATA_TYPE& rSrcData);
};

/**
 * @param rData - reference to the memory placement of new object.
 */
template <typename DATA_TYPE>
inline void CDynamicTraits<DATA_TYPE>::Constructor(DATA_TYPE& rData)
{
	rData = NULL;
}

/**
 * @param rData - reference to the memory placement of deleted object.
 */
template <typename DATA_TYPE>
inline void CDynamicTraits<DATA_TYPE>::Destructor(DATA_TYPE& rData)
{
	delete rData;
}

/**
 * @param rDstData - reference to the memory placement of destination object.
 * @param rSrcData - reference to the memory placement of source object.
 */
template <typename DATA_TYPE>
inline void CDynamicTraits<DATA_TYPE>::Assignment(DATA_TYPE& rDstData, const DATA_TYPE& rSrcData)
{
	delete rDstData;
	rDstData = rSrcData;
}

/// Data comparator traits.
template <typename DATA_TYPE>
class CCompareTraits
{
public:
	/// Determines whatever two elements are equal to each other.
	static bool Compare(const DATA_TYPE& rData1, const DATA_TYPE& rData2);
	/// Compares two elements according to their order.
	static int OrderedCompare(const DATA_TYPE& rData1, const DATA_TYPE& rData2);
};

/**
 * @param rData1 - reference to the first element.
 * @param rData2 - reference to the second element.
 * @return true if elements are equal.
 */
template <typename DATA_TYPE>
inline bool CCompareTraits<DATA_TYPE>::Compare(const DATA_TYPE& rData1, const DATA_TYPE& rData2)
{
	return (rData1 == rData2);
}

/**
 * @param rData1 - reference to the first element.
 * @param rData2 - reference to the second element.
 * @return comparison result:
 * - < 0 if first element is less than second element;
 * - = 0 if first element is equal to the second element;
 * - > 0 if first element is greater than second element.
 */
template <typename DATA_TYPE>
int CCompareTraits<DATA_TYPE>::OrderedCompare(const DATA_TYPE& rData1, const DATA_TYPE& rData2)
{
	if (rData1 < rData2)
		return -1;
	else if (rData2 < rData1)
		return +1;
	else
		return 0;
}

/// Explicit template specialization for strings.
template <> class CCompareTraits<TCHAR*>
{
public:
	/// Determines whatever two elements are equal to each other.
	static bool Compare(TCHAR * const & rData1, TCHAR * const & rData2);
	/// Compares two elements according to their order.
	static int OrderedCompare(TCHAR * const & rData1, TCHAR * const & rData2);
};

/**
 * @param rData1 - reference to the first element.
 * @param rData2 - reference to the second element.
 * @return true if elements are equal.
 */
inline bool CCompareTraits<TCHAR*>::Compare(TCHAR * const & rData1, TCHAR * const & rData2)
{
	return (_tcscmp(rData1, rData2) == 0);
}

/**
 * @param rData1 - reference to the first element.
 * @param rData2 - reference to the second element.
 * @return comparison result:
 * - < 0 if first element is less than second element;
 * - = 0 if first element is equal to the second element;
 * - > 0 if first element is greater than second element.
 */
inline int CCompareTraits<TCHAR*>::OrderedCompare(TCHAR * const & rData1, TCHAR * const & rData2)
{
	return _tcscmp(rData1, rData2);
}

/// Explicit template specialization for strings.
template <> class CCompareTraits<const TCHAR*>
{
public:
	/// Determines whatever two elements are equal to each other.
	static bool Compare(TCHAR const * const & rData1, TCHAR const * const & rData2);
	/// Compares two elements according to their order.
	static int OrderedCompare(TCHAR const * const & rData1, TCHAR const * const & rData2);
};

/**
 * @param rData1 - reference to the first element.
 * @param rData2 - reference to the second element.
 * @return true if elements are equal.
 */
inline bool CCompareTraits<const TCHAR*>::Compare(TCHAR const * const & rData1, TCHAR const * const & rData2)
{
	return (_tcscmp(rData1, rData2) == 0);
}

/**
 * @param rData1 - reference to the first element.
 * @param rData2 - reference to the second element.
 * @return comparison result:
 * - < 0 if first element is less than second element;
 * - = 0 if first element is equal to the second element;
 * - > 0 if first element is greater than second element.
 */
inline int CCompareTraits<const TCHAR*>::OrderedCompare(TCHAR const * const & rData1, TCHAR const * const & rData2)
{
	return _tcscmp(rData1, rData2);
}

/// Comparator traits used for incomparable objects.
template <typename DATA_TYPE>
class CIncomparableTraits
{
public:
	/// Determines whatever two elements are equal to each other.
	static bool Compare(const DATA_TYPE& rData1, const DATA_TYPE& rData2);
	/// Compares two elements according to their order.
	static int OrderedCompare(const DATA_TYPE& rData1, const DATA_TYPE& rData2);
};

/**
 * @param rData1 - reference to the first element.
 * @param rData2 - reference to the second element.
 * @return true if elements are equal.
 */
template <typename DATA_TYPE>
inline bool CIncomparableTraits<DATA_TYPE>::Compare(const DATA_TYPE& /*rData1*/, const DATA_TYPE& /*rData2*/)
{
	_ASSERT(FALSE);
	return false;
}

/**
 * @param rData1 - reference to the first element.
 * @param rData2 - reference to the second element.
 * @return comparison result:
 * - < 0 if first element is less than second element;
 * - = 0 if first element is equal to the second element;
 * - > 0 if first element is greater than second element.
 */
template <typename DATA_TYPE>
int CIncomparableTraits<DATA_TYPE>::OrderedCompare(const DATA_TYPE& /*rData1*/, const DATA_TYPE& /*rData2*/)
{
	_ASSERT(FALSE);
	return 0;
}

/// Hash key traits.
template <typename KEY_TYPE>
class CHashTraits
{
public:
	/// Computes the hash value for the given object instance.
	static unsigned HashKey(const KEY_TYPE& key);
};

/**
 * @param key - hash value must be generated for this object.
 * @return hash value of the given object.
 */
template <typename KEY_TYPE>
inline unsigned CHashTraits<KEY_TYPE>::HashKey(const KEY_TYPE& key)
{
	return ((unsigned)key >> 4);
}

/// Explicit template specialization for string hash tables.
template <> class CHashTraits<CStrHolder>
{
public:
	/// Computes the hash value for the given object instance.
	static unsigned HashKey(const CStrHolder& strKey);
};

/**
 * @param strKey - hash value must be generated for this string.
 * @return hash value of the given object.
 */
inline unsigned CHashTraits<CStrHolder>::HashKey(const CStrHolder& strKey)
{
	extern unsigned GetStringHashValue(const TCHAR* pszKey);
	return GetStringHashValue((PCTSTR)strKey);
}

/// Explicit template specialization for string hash tables.
template <> class CHashTraits<CStrStream>
{
public:
	/// Computes the hash value for the given object instance.
	static unsigned HashKey(const CStrStream& strKey);
};

/**
 * @param strKey - hash value must be generated for this string.
 * @return hash value of the given object.
 */
inline unsigned CHashTraits<CStrStream>::HashKey(const CStrStream& strKey)
{
	extern unsigned GetStringHashValue(const TCHAR* pszKey);
	return GetStringHashValue((PCTSTR)strKey);
}

/// Explicit template specialization for string hash tables.
template <> class CHashTraits<TCHAR*>
{
public:
	/// Computes the hash value for the given object instance.
	static unsigned HashKey(TCHAR * const & pszKey);
};

/**
 * @param pszKey - hash value must be generated for this string.
 * @return hash value of the given object.
 */
inline unsigned CHashTraits<TCHAR*>::HashKey(TCHAR * const & pszKey)
{
	extern unsigned GetStringHashValue(const TCHAR* pszKey);
	return GetStringHashValue(pszKey);
}

/// Explicit template specialization for string hash tables.
template <> class CHashTraits<const TCHAR*>
{
public:
	/// Computes the hash value for the given object instance.
	static unsigned HashKey(TCHAR const * const & pszKey);
};

/**
 * @param pszKey - hash value must be generated for this string.
 * @return hash value of the given object.
 */
inline unsigned CHashTraits<const TCHAR*>::HashKey(TCHAR const * const & pszKey)
{
	extern unsigned GetStringHashValue(const TCHAR* pszKey);
	return GetStringHashValue(pszKey);
}

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 MIT License


Written By
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions