#include <atlcoll.h>
#include <boost/functional/hash.hpp>

 

struct PRODUCTSELLPOLICYINDEX
{
    union
    {
        struct KEY
        {
            INT32    nProdSellPoliID;
            INT32 nProdID;
        };
        KEY Key;
        INT64 nValue;
    };

    PRODUCTSELLPOLICYINDEX() : nValue(0) {}
    PRODUCTSELLPOLICYINDEX(INT64 _value) : nValue(_value) {}
    PRODUCTSELLPOLICYINDEX(INT32 _nProdSellPoliID, INT32 _nProdID)
    {
        Key.nProdSellPoliID = _nProdSellPoliID;
        Key.nProdID = _nProdID;
    }
};

class ProductSellPolicyKeyTraits : public CElementTraits <PRODUCTSELLPOLICYINDEX>
{
public:
    static ULONG Hash(const PRODUCTSELLPOLICYINDEX& element) throw()
    {
        boost::hash<INT64> hasher;
        return (ULONG)hasher(element.nValue);
    }
    static bool CompareElements(const PRODUCTSELLPOLICYINDEX& a, const PRODUCTSELLPOLICYINDEX& b)
    {
        return (a.Key.nProdSellPoliID == b.Key.nProdSellPoliID && a.Key.nProdID == b.Key.nProdID) ? true : false;
    };
};

struct PRODUCTSELLPOLICY
{
    INT32    nProdSellPoliID;
    INT32 nPrice;
    char nExpirationType;
    INT16 nUseNum;
    INT32 nUsagePeriod;
    char szExpiDateTime[ MAX_DATETIME_LENGTH ];
    PRODUCT Product;

    void Clone( PRODUCTSELLPOLICY& ProductSellPolicy )
    {
        ProductSellPolicy.nProdSellPoliID = nProdSellPoliID;
        ProductSellPolicy.nPrice = nPrice;
        ProductSellPolicy.nExpirationType = nExpirationType;
        ProductSellPolicy.nUseNum = nUseNum;
        ProductSellPolicy.nUsagePeriod = nUsagePeriod;
        strncpy_s( ProductSellPolicy.szExpiDateTime, MAX_DATETIME_LENGTH,  szExpiDateTime, MAX_DATETIME_LENGTH - 1 );
        Product.Clone( ProductSellPolicy.Product );
    }
};

 

typedef CAtlMap<PRODUCTSELLPOLICYINDEX, PRODUCTSELLPOLICY, ProductSellPolicyKeyTraits> MAP_SELLPOLICY;

 

bool IsValideProductSellPolicy( INT32 nProdSellPoliID, INT32 nProdID )
{
    PRODUCTSELLPOLICYINDEX PolicyKey( nProdSellPoliID, nProdID );
    bool bIsExit = m_ProductSellPolicyList.Lookup( PolicyKey );
    return bIsExit;
}

 

신고
by 흥배 2012.09.10 09:00

CAtlMap에서 문자열을 Key로 사용하기 위해서는 Key 타입으로 CString을 사용합니다.

 

< 예제 코드 >

CAtlMap<CString, int> NameMap;

NameMap.SetAt( Test1, 11 );

저작자 표시
신고
by 흥배 2009.12.22 14:11

CAtlMap을 사용할 보통 KEY는 하나의 값을 사용합니다. 그런데 KEY 값이 하나가 아닌 두 개가 되어야 하나의 KEY가 되는 경우가 있습니다.

이럴 때는 KEY가 되는 것을 struct로 정의하고, CElementTraits을 상속 받는 Traits 클래스를 만들어야 합니다.

 

 

#include <atlcoll.h>
#include <boost/functional/hash.hpp>  // hash
를 만들기 위해 사용

// KEY가 될 유저 정의형
struct FRIENDKEY
{
    union
    {
        struct KEY
        {
            INT32    MyID;
            INT32  FriendID;
        };
        KEY Key;
        INT64 nValue;
    };

    FRIENDKEY() : nValue(0) {}
    FRIENDKEY(INT64 _value) : nValue(_value) {}
    FRIENDKEY(INT32 _MyID, INT32 _FriendID)
    {
        Key.MyID = _MyID;
        Key.FriendID = _FriendID;
    }
};

class FriendKeyTraits : public CElementTraits <FRIENDKEY>
{
public:
    static ULONG Hash(const FRIENDKEY& element) throw()
    {
        boost::hash<INT64> hasher;
        return (ULONG)hasher(element.nValue);
    }

    static bool CompareElements(const FRIENDKEY& a, const FRIENDKEY& b)
    {
        return (a.Key.nMyID == b.Key.MyID && a.Key.FriendID == b.Key.FriendID) ? true : false;
    };
};

struct FRIENDPRESENT
{
    INT32    a;
    INT32 b;
    char c;
    INT16 d;
};

 

typedef CAtlMap<FRIENDKEY, FRIENDPRESENT, FriendKeyTraits > MAP_FRIEND;
MAP_FRIEND m_Frinedlist;

 

bool IsExitFriendPresent( INT32 MyID, INT32 FriendID )
{
    FRIENDKEY FriendKey( MyID, FriendID );
    bool bIsExit = m_Frinedlist.Lookup( FriendKey );
    return bIsExit;
}

 

이거 말고 더 좋은 방법이나, KEY로 사용할 값이 3 개 이상인 경우는 어떻게 하면 좋을지 덧글이나 트랙백 부탁합니다.^^

저작자 표시
신고
by 흥배 2009.10.22 08:30
CAtlMap에 대한 글입니다. 글 내용은 거의다 MSDN에 있는 것입니다.
원래는 좀 더 다듬어서 공개하려고 했는데 다른 일로 계속 바빠서 언제 될지
알 수가 없어서(원래 계획에서 3달째 연기 중이네요) 현재까지 정리한 것만 이라도
먼저 공개하고 다음에 제대로 글 적어서 다시 공개하겠습니다.



오타 수정
InitHashTable()에서 bAllocNow 파라메터 설명이 틀렸습니다.
"true일 때는 초기화 시에 해시 테이블을 할당한다.
그 이외의 경우는 필요에 따라서 테이블리 할당되어 진다." 입니다.
저작자 표시
신고
by 흥배 2009.04.30 00:15
| 1 |

티스토리 툴바