text: //
  // SortString.h
  //
  
  #pragma once
  
  
  typedef int (WINAPI* SORTSTRING_COMPARE_PROC)(LPCTSTR, LPCTSTR);
  
  // A custom compare routine that will put strings like "100+" after "9"
  int WINAPI CompareStringsWithNumbers(LPCTSTR psz1, LPCTSTR psz2);
  
  
  class CSortedStringArray
  {
  public:
  	CSortedStringArray(SORTSTRING_COMPARE_PROC pfnCustomCompare = NULL);
  	~CSortedStringArray();
  
  	int Add(LPCTSTR psz, DWORD dwData);
  	int GetSize() const;
  	LPCTSTR GetAt(int iItem) const;
  	LPCTSTR operator[](int iItem) const;
  	DWORD GetItemData(int iItem) const;
  	int Find(LPCTSTR pszString) const;
  
  protected:
  	LPTSTR*	m_prgStrings; // points to string data, which is preceded by 4-byte item data
  	int m_cStrings;
  	int m_maxStrings;
  
  	SORTSTRING_COMPARE_PROC m_pfnCompare;
  
  	static int __cdecl _crtCompareHelper(const void* elem1, const void* elem2);
  	static SORTSTRING_COMPARE_PROC _pfnCompare;
  };
  
  inline int CSortedStringArray::GetSize() const
  {
  	return m_cStrings;
  }
  
  inline LPCTSTR CSortedStringArray::GetAt(int iItem) const
  {
  	ASSERT(iItem >= 0 && iItem < m_cStrings);
  	return m_prgStrings[iItem];
  }
  
  inline LPCTSTR CSortedStringArray::operator[](int iItem) const
  {
  	return GetAt(iItem);
  }
  
  inline DWORD CSortedStringArray::GetItemData(int iItem) const
  {
  	ASSERT(iItem >= 0 && iItem < m_cStrings);
  	return *((DWORD*)m_prgStrings[iItem] - 1);
  }
  