261 lines
5.2 KiB
C
261 lines
5.2 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1998 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
FTMan
|
|||
|
|
|||
|
File Name:
|
|||
|
|
|||
|
Set.h
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Definition and implementation of template class CSet.
|
|||
|
CSet is a set of elements of the same type. The type of the elements must have a equivalence operator ("==")
|
|||
|
defined.
|
|||
|
No duplicate elements are allowed in the set. The elements are stored in ascendent sort order
|
|||
|
Main set operations:
|
|||
|
- Reunion
|
|||
|
- Intersection
|
|||
|
- Difference
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Cristian Teodorescu November 4, 1998
|
|||
|
|
|||
|
Notes:
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
#if !defined(AFX_SET_H_INCLUDED_)
|
|||
|
#define AFX_SET_H_INCLUDED_
|
|||
|
|
|||
|
#if _MSC_VER > 1000
|
|||
|
#pragma once
|
|||
|
#endif // _MSC_VER > 1000
|
|||
|
|
|||
|
#include <afxtempl.h>
|
|||
|
|
|||
|
template< class TYPE, class ARG_TYPE >
|
|||
|
class CSet : protected CArray<TYPE, ARG_TYPE>
|
|||
|
{
|
|||
|
// Public constructors
|
|||
|
public:
|
|||
|
CSet() {};
|
|||
|
CSet( const CSet& set );
|
|||
|
|
|||
|
// Public operations
|
|||
|
public:
|
|||
|
// Check if the set is empty
|
|||
|
BOOL IsEmpty() const;
|
|||
|
|
|||
|
// Get the size of the set
|
|||
|
int GetSize( ) const;
|
|||
|
|
|||
|
// Check if an element is in the set
|
|||
|
BOOL InSet( ARG_TYPE elm ) const;
|
|||
|
|
|||
|
// Add a element to the set
|
|||
|
void Add( ARG_TYPE elm );
|
|||
|
|
|||
|
// Remove a element from the set
|
|||
|
void Remove( ARG_TYPE elm );
|
|||
|
|
|||
|
// Remove all elements from the set
|
|||
|
void RemoveAll();
|
|||
|
|
|||
|
// Subscript operator
|
|||
|
TYPE operator []( int nIndex ) const;
|
|||
|
|
|||
|
// Assignment operator
|
|||
|
void operator=( const CSet& set );
|
|||
|
|
|||
|
// Reunion of two sets
|
|||
|
void operator+=( const CSet& set );
|
|||
|
//const CSet& operator+( const CSet& set ) const;
|
|||
|
|
|||
|
// Intersection of two sets
|
|||
|
void operator*=(const CSet& set );
|
|||
|
//const CSet& operator*( const CSet& set ) const;
|
|||
|
|
|||
|
// Difference of two sets
|
|||
|
void operator-=( const CSet& set );
|
|||
|
//const CSet& operator-( const CSet& set ) const;
|
|||
|
};
|
|||
|
|
|||
|
// Off-line methods
|
|||
|
|
|||
|
// Copy constructor
|
|||
|
template< class TYPE, class ARG_TYPE >
|
|||
|
CSet<TYPE, ARG_TYPE>::CSet( const CSet& set )
|
|||
|
{
|
|||
|
MY_TRY
|
|||
|
|
|||
|
for( int i = 0; i < set.GetSize(); i++ )
|
|||
|
CArray<TYPE, ARG_TYPE>::Add( set[i] );
|
|||
|
|
|||
|
MY_CATCH_AND_THROW
|
|||
|
}
|
|||
|
|
|||
|
// Check if the set is empty
|
|||
|
template< class TYPE, class ARG_TYPE >
|
|||
|
BOOL CSet<TYPE, ARG_TYPE>::IsEmpty() const
|
|||
|
{
|
|||
|
return ( GetSize() == 0 );
|
|||
|
}
|
|||
|
|
|||
|
template< class TYPE, class ARG_TYPE >
|
|||
|
int CSet<TYPE, ARG_TYPE>::GetSize() const
|
|||
|
{
|
|||
|
return (int)CArray<TYPE, ARG_TYPE>::GetSize();
|
|||
|
}
|
|||
|
|
|||
|
// Check if an element is in the set
|
|||
|
template< class TYPE, class ARG_TYPE >
|
|||
|
BOOL CSet<TYPE, ARG_TYPE>::InSet( ARG_TYPE elm ) const
|
|||
|
{
|
|||
|
// The array is sorted !!
|
|||
|
for( int i = 0; i < GetSize(); i++ )
|
|||
|
{
|
|||
|
if( GetAt(i) > elm )
|
|||
|
return FALSE;
|
|||
|
else if( GetAt(i) == elm )
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
// Add a element to the set
|
|||
|
template< class TYPE, class ARG_TYPE >
|
|||
|
void CSet<TYPE, ARG_TYPE>::Add( ARG_TYPE elm )
|
|||
|
{
|
|||
|
MY_TRY
|
|||
|
|
|||
|
// No duplicates are allowed
|
|||
|
// The new element is inserted in the right place in the ascending sorted array
|
|||
|
for( int i = 0; i < GetSize(); i++ )
|
|||
|
{
|
|||
|
if( GetAt(i) > elm )
|
|||
|
break;
|
|||
|
else if( GetAt(i) == elm )
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
InsertAt( i, elm );
|
|||
|
|
|||
|
MY_CATCH_AND_THROW
|
|||
|
}
|
|||
|
|
|||
|
// Remove a element from the set
|
|||
|
template< class TYPE, class ARG_TYPE >
|
|||
|
void CSet<TYPE, ARG_TYPE>::Remove( ARG_TYPE elm )
|
|||
|
{
|
|||
|
// The array is sorted !!
|
|||
|
for( int i = 0; i < GetSize(); i++ )
|
|||
|
{
|
|||
|
if( GetAt(i) > elm )
|
|||
|
return;
|
|||
|
else if( GetAt(i) == elm )
|
|||
|
{
|
|||
|
RemoveAt(i);
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Remove all elements from the set
|
|||
|
template< class TYPE, class ARG_TYPE >
|
|||
|
void CSet<TYPE, ARG_TYPE>::RemoveAll()
|
|||
|
{
|
|||
|
CArray<TYPE, ARG_TYPE>::RemoveAll();
|
|||
|
}
|
|||
|
|
|||
|
// Subscript operator
|
|||
|
template< class TYPE, class ARG_TYPE >
|
|||
|
TYPE CSet<TYPE, ARG_TYPE>::operator []( int nIndex ) const
|
|||
|
{
|
|||
|
return CArray<TYPE, ARG_TYPE>::operator[]( nIndex );
|
|||
|
}
|
|||
|
|
|||
|
// Assignment operator
|
|||
|
template< class TYPE, class ARG_TYPE >
|
|||
|
void CSet<TYPE, ARG_TYPE>::operator=( const CSet& set )
|
|||
|
{
|
|||
|
MY_TRY
|
|||
|
|
|||
|
RemoveAll();
|
|||
|
for( int i = 0; i < set.GetSize(); i++ )
|
|||
|
CArray<TYPE, ARG_TYPE>::Add( set[i] );
|
|||
|
|
|||
|
MY_CATCH_AND_THROW
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
// Reunion of two sets. The result is stored in the first operand
|
|||
|
template< class TYPE, class ARG_TYPE >
|
|||
|
void CSet<TYPE, ARG_TYPE>::operator+=( const CSet& set )
|
|||
|
{
|
|||
|
MY_TRY
|
|||
|
|
|||
|
for( int i = 0; i < set.GetSize(); i++ )
|
|||
|
Add( set[i] );
|
|||
|
|
|||
|
MY_CATCH_AND_THROW
|
|||
|
}
|
|||
|
|
|||
|
// Reunion of two sets. The result is stored in a third set
|
|||
|
/*
|
|||
|
template< class TYPE, class ARG_TYPE >
|
|||
|
const CSet<TYPE, ARG_TYPE>& CSet<TYPE, ARG_TYPE>::operator+( const CSet& set ) const
|
|||
|
{
|
|||
|
}
|
|||
|
*/
|
|||
|
|
|||
|
// Intersection of two sets. The result is stored in the first operand
|
|||
|
template< class TYPE, class ARG_TYPE >
|
|||
|
void CSet<TYPE, ARG_TYPE>::operator*=( const CSet& set )
|
|||
|
{
|
|||
|
for( int i = GetSize()-1; i >= 0; i-- )
|
|||
|
{
|
|||
|
ARG_TYPE elm = GetAt(i);
|
|||
|
if( !set.InSet(elm) )
|
|||
|
RemoveAt(i);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Intersection of two sets. The result is stored in a third set
|
|||
|
/*
|
|||
|
template< class TYPE, class ARG_TYPE >
|
|||
|
const CSet<TYPE, ARG_TYPE>& CSet<TYPE, ARG_TYPE>::operator*( const CSet& set ) const
|
|||
|
{
|
|||
|
}
|
|||
|
*/
|
|||
|
|
|||
|
// Difference of two sets. The result is stored in the first operand
|
|||
|
template< class TYPE, class ARG_TYPE >
|
|||
|
void CSet<TYPE, ARG_TYPE>::operator-=( const CSet& set )
|
|||
|
{
|
|||
|
for( int i = GetSize()-1; i >= 0; i-- )
|
|||
|
{
|
|||
|
ARG_TYPE elm = GetAt(i);
|
|||
|
if( set.InSet(elm) )
|
|||
|
RemoveAt[i];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Difference of two sets. The result is stored in a third set
|
|||
|
/*
|
|||
|
template< class TYPE, class ARG_TYPE >
|
|||
|
const CSet<TYPE, ARG_TYPE>& CSet<TYPE, ARG_TYPE>::operator-( const CSet& set ) const
|
|||
|
{
|
|||
|
}
|
|||
|
*/
|
|||
|
|
|||
|
#endif // !defined(AFX_SET_H_INCLUDED_)
|
|||
|
|