home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / com / allinone / server / stlcoll_.h < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-03  |  9.2 KB  |  353 lines

  1. #include "stdafx.h"
  2. #include <map>
  3. #include <list>
  4. #include <vector>
  5. #include <deque>
  6. #include <set>
  7.  
  8. using namespace std;
  9.  
  10. #define _USEME_
  11. #include "stlcoll.h"
  12.  
  13. #include "resource.h"       // main symbols
  14.  
  15. /////////////////////////////////////////////////////////////////////////////
  16. // StlMaps
  17.  
  18. class CStlMapStringToMyObject :
  19.     public IStlMapStringToMyObject,
  20.     public CComObjectRoot,
  21.     public CComCoClass<CStlMapStringToMyObject,&CLSID_CStlMapStringToMyObject>
  22. {
  23. public:
  24.     CStlMapStringToMyObject() {}
  25. BEGIN_COM_MAP(CStlMapStringToMyObject)
  26.     COM_INTERFACE_ENTRY(IStlMapStringToMyObject)
  27. END_COM_MAP()
  28.  
  29. DECLARE_REGISTRY_RESOURCEID(IDR_StlMapStringToMyObject)
  30.  
  31.     map<CString, CMyObject*> m_map;
  32.     map<CString, CMyObject*>::iterator m_mapiter;
  33.  
  34.     STDMETHOD(get_Map)(BSTR str, IMyStruct** obj);
  35.     STDMETHOD(put_Map)(BSTR str, IMyStruct* obj);
  36.     STDMETHOD(Lookup)(BSTR str, IMyStruct** obj, VARIANT_BOOL* b);
  37.     STDMETHOD(First)();
  38.     STDMETHOD(Next)(BSTR* str, IMyStruct** obj, VARIANT_BOOL* b);
  39.     STDMETHOD(get_Remove)(BSTR* str);
  40.     STDMETHOD(RemoveAll)();
  41.     STDMETHOD(get_Count)(UINT* dw);
  42. };
  43.  
  44. class CStlMapDWordToMyStruct :
  45.     public IStlMapDWordToMyStruct,
  46.     public CComObjectRoot,
  47.     public CComCoClass<CStlMapDWordToMyStruct,&CLSID_CStlMapDWordToMyStruct>
  48. {
  49. public:
  50.     CStlMapDWordToMyStruct() {}
  51. BEGIN_COM_MAP(CStlMapDWordToMyStruct)
  52.     COM_INTERFACE_ENTRY(IStlMapDWordToMyStruct)
  53. END_COM_MAP()
  54.  
  55. DECLARE_REGISTRY_RESOURCEID(IDR_StlMapDWordToMyStruct)
  56.  
  57.     multimap<DWORD, CMyStruct*> m_map;
  58.     multimap<DWORD, CMyStruct*>::iterator m_mapiter;
  59.  
  60.     STDMETHOD(get_Map)(DWORD dw, IMyStruct** str);
  61.     STDMETHOD(put_Map)(DWORD dw, IMyStruct* str);
  62.     STDMETHOD(Lookup)(DWORD dw, IMyStruct** str, VARIANT_BOOL* b);
  63.     STDMETHOD(First)();
  64.     STDMETHOD(Next)(DWORD* dw, IMyStruct** str, VARIANT_BOOL* b);
  65.     STDMETHOD(get_Remove)(DWORD* str);
  66.     STDMETHOD(RemoveAll)();
  67.     STDMETHOD(get_Count)(UINT* dw);
  68. };
  69.  
  70. class CStlMapStringToString :
  71.     public IStlMapStringToString,
  72.     public CComObjectRoot,
  73.     public CComCoClass<CStlMapStringToString,&CLSID_CStlMapStringToString>
  74. {
  75. public:
  76.     CStlMapStringToString() {}
  77. BEGIN_COM_MAP(CStlMapStringToString)
  78.     COM_INTERFACE_ENTRY(IStlMapStringToString)
  79. END_COM_MAP()
  80.  
  81. DECLARE_REGISTRY_RESOURCEID(IDR_StlMapStringToString)
  82.  
  83.     map<CString, CString> m_map;
  84.     map<CString, CString>::iterator m_mapiter;
  85.  
  86.     STDMETHOD(get_Map)(BSTR str1, BSTR* str2);
  87.     STDMETHOD(put_Map)(BSTR str1, BSTR str2);
  88.     STDMETHOD(Lookup)(BSTR str1, BSTR* str2, VARIANT_BOOL* b);
  89.     STDMETHOD(First)();
  90.     STDMETHOD(Next)(BSTR* str1, BSTR* str2, VARIANT_BOOL* b);
  91.     STDMETHOD(get_Remove)(BSTR* str);
  92.     STDMETHOD(RemoveAll)();
  93.     STDMETHOD(get_Count)(UINT* dw);
  94. };
  95.  
  96. class CStlMaps :
  97.     public IStlMaps,
  98.     public CComObjectRoot,
  99.     public CComCoClass<CStlMaps,&CLSID_CStlMaps>
  100. {
  101. public:
  102.     CStlMaps() {}
  103.  
  104.     HRESULT FinalConstruct()
  105.     {
  106.     return CoCreateInstance(CLSID_CStlMapStringToMyObject, GetControllingUnknown(), CLSCTX_ALL, IID_IUnknown, (void**) &m_pUnkMapStringToMyObject);
  107.     }
  108.  
  109.     void FinalRelease()
  110.     {
  111.         m_pUnkMapStringToMyObject.Release();
  112.         m_pUnkMapDWordToMyStruct.Release();
  113.         m_pUnkMapStringToString.Release();
  114.     }
  115.  
  116. BEGIN_COM_MAP(CStlMaps)
  117.     COM_INTERFACE_ENTRY(IStlMaps)
  118.     COM_INTERFACE_ENTRY_AGGREGATE(IID_IStlMapStringToMyObject, m_pUnkMapStringToMyObject.p)
  119.     COM_INTERFACE_ENTRY_AUTOAGGREGATE(IID_IStlMapDWordToMyStruct, m_pUnkMapDWordToMyStruct.p, CLSID_CStlMapDWordToMyStruct)
  120.     COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND(m_pUnkMapStringToString.p, CLSID_CStlMapStringToString)
  121.     //COM_INTERFACE_ENTRY_AUTOAGGREGATE(IID_IStlMapStringToString, m_pUnkMapStringToString.p, CLSID_CStlMapStringToString)
  122. END_COM_MAP()
  123.  
  124.  
  125. DECLARE_REGISTRY_RESOURCEID(IDR_StlMaps)
  126. DECLARE_GET_CONTROLLING_UNKNOWN()
  127.  
  128. CComPtr<IUnknown> m_pUnkMapStringToMyObject;
  129. CComPtr<IUnknown> m_pUnkMapDWordToMyStruct;
  130. CComPtr<IUnknown> m_pUnkMapStringToString;
  131. };
  132.  
  133. /////////////////////////////////////////////////////////////////////////////
  134. // StlLists
  135.  
  136. class CStlStringList :
  137.     public IStlStringList,
  138.     public CComTearOffObjectBase<CStlLists>
  139. {
  140. public:
  141.     CStlStringList() {}
  142. BEGIN_COM_MAP(CStlStringList)
  143.     COM_INTERFACE_ENTRY(IStlStringList)
  144. END_COM_MAP()
  145.  
  146. DECLARE_REGISTRY_RESOURCEID(IDR_StlStringList)
  147.  
  148.     //set<CString> m_list;
  149.     //set<CString>::iterator m_listiter;
  150.  
  151.     list<CString> m_list;
  152.     list<CString>::iterator m_listiter;
  153.  
  154.     STDMETHOD(Find)(BSTR str, VARIANT_BOOL* b);
  155.     STDMETHOD(put_SetAt)(BSTR str);
  156.     STDMETHOD(put_Add)(BSTR str);
  157.     STDMETHOD(put_InsertBefore)(BSTR str);
  158.     STDMETHOD(get_Remove)(BSTR* str);
  159.     STDMETHOD(RemoveAll)();
  160.     STDMETHOD(First)();
  161.     STDMETHOD(Next)(BSTR* str, VARIANT_BOOL* b);
  162.     STDMETHOD(get_Count)(UINT* dw);
  163. };
  164.  
  165. class CStlintList :
  166.     public IStlintList,
  167.     public CComTearOffObjectBase<CStlLists>
  168. {
  169. public:
  170.     CStlintList() {}
  171. BEGIN_COM_MAP(CStlintList)
  172.     COM_INTERFACE_ENTRY(IStlintList)
  173. END_COM_MAP()
  174.  
  175. DECLARE_REGISTRY_RESOURCEID(IDR_StlintList)
  176.  
  177.     //multiset<int> m_list;
  178.     //multiset<int>::iterator m_listiter;
  179.  
  180.     list<int> m_list;
  181.     list<int>::iterator m_listiter;
  182.  
  183.     STDMETHOD(Find)(long n, VARIANT_BOOL* b);
  184.     STDMETHOD(put_SetAt)(long n);
  185.     STDMETHOD(put_Add)(long n);
  186.     STDMETHOD(put_InsertBefore)(long n);
  187.     STDMETHOD(get_Remove)(long* n);
  188.     STDMETHOD(RemoveAll)();
  189.     STDMETHOD(First)();
  190.     STDMETHOD(Next)(long* n, VARIANT_BOOL* b);
  191.     STDMETHOD(get_Count)(UINT* dw);
  192. };
  193.  
  194. class CStlLists :
  195.     public IStlLists,
  196.     public IStlMyStructList,
  197.     public CComObjectRoot,
  198.     public CComCoClass<CStlLists,&CLSID_CStlLists>
  199. {
  200. public:
  201.     CStlLists() {}
  202.  
  203.     void FinalRelease()
  204.     {
  205.         m_pUnkStringList.Release();
  206.     }
  207.  
  208. BEGIN_COM_MAP(CStlLists)
  209.     COM_INTERFACE_ENTRY(IStlLists)
  210.     COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(IID_IStlStringList, CStlStringList, m_pUnkStringList.p)
  211.     COM_INTERFACE_ENTRY(IStlMyStructList)
  212.     COM_INTERFACE_ENTRY_TEAR_OFF(IID_IStlintList, CStlintList)
  213. END_COM_MAP()
  214.  
  215. DECLARE_REGISTRY_RESOURCEID(IDR_StlLists)
  216. DECLARE_GET_CONTROLLING_UNKNOWN()
  217.  
  218.     list<CMyStruct*> m_list;
  219.     list<CMyStruct*>::iterator m_listiter;
  220.  
  221.     STDMETHOD(Find)(IMyStruct* str, VARIANT_BOOL* b);
  222.     STDMETHOD(put_SetAt)(IMyStruct* str);
  223.     STDMETHOD(put_Add)(IMyStruct* str);
  224.     STDMETHOD(put_InsertBefore)(IMyStruct* str);
  225.     STDMETHOD(get_Remove)(IMyStruct** str);
  226.     STDMETHOD(RemoveAll)();
  227.     STDMETHOD(First)();
  228.     STDMETHOD(Next)(IMyStruct** str, VARIANT_BOOL* b);
  229.     STDMETHOD(get_Count)(UINT* dw);
  230.  
  231.     CComPtr<IUnknown> m_pUnkStringList;
  232. };
  233.  
  234. /////////////////////////////////////////////////////////////////////////////
  235. // StlArrays
  236.  
  237. class CStlDWordArray :
  238.     public IStlDWordArray,
  239.     public CComObjectRoot,
  240.     public CComCoClass<CStlDWordArray,&CLSID_CStlDWordArray>
  241. {
  242. public:
  243.     CStlDWordArray() {}
  244. BEGIN_COM_MAP(CStlDWordArray)
  245.     COM_INTERFACE_ENTRY(IStlDWordArray)
  246. END_COM_MAP()
  247.  
  248. DECLARE_REGISTRY_RESOURCEID(IDR_StlDWordArray)
  249.  
  250.     vector<DWORD> m_array;
  251.     vector<DWORD>::iterator m_arrayiter;
  252.  
  253.     STDMETHOD(get_Array)(long idx, DWORD* dw);
  254.     STDMETHOD(put_Array)(long idx, DWORD dw);
  255.     STDMETHOD(put_Add)(DWORD dw);
  256.     STDMETHOD(get_Remove)(long idx, DWORD* dw);
  257.     STDMETHOD(RemoveAll)();
  258.     STDMETHOD(First)();
  259.     STDMETHOD(Next)(DWORD* pt, VARIANT_BOOL* b);
  260.     STDMETHOD(get_Count)(UINT* dw);
  261. };
  262.  
  263. class CStlMyObjectArray :
  264.     public IStlMyObjectArray,
  265.     public CComObjectRoot
  266. {
  267. public:
  268.     CStlMyObjectArray() {}
  269.  
  270.     HRESULT FinalConstruct()
  271.     {
  272.     return CoCreateInstance(CLSID_CStlDWordArray, GetControllingUnknown(), CLSCTX_ALL, IID_IUnknown, (void**) &m_pUnkDWordArray);
  273.     }
  274.  
  275.     void FinalRelease()
  276.     {
  277.         m_pUnkDWordArray.Release();
  278.     }
  279.  
  280. BEGIN_COM_MAP(CStlMyObjectArray)
  281.     COM_INTERFACE_ENTRY(IStlMyObjectArray)
  282.     COM_INTERFACE_ENTRY_AGGREGATE_BLIND(m_pUnkDWordArray.p)
  283. END_COM_MAP()
  284.  
  285. DECLARE_REGISTRY_RESOURCEID(IDR_StlMyObjectArray)
  286. DECLARE_GET_CONTROLLING_UNKNOWN()
  287.  
  288.     vector<CMyObject*> m_array;
  289.     vector<CMyObject*>::iterator m_arrayiter;
  290.  
  291.     STDMETHOD(get_Array)(long idx, IMyStruct** str);
  292.     STDMETHOD(put_Array)(long idx, IMyStruct* str);
  293.     STDMETHOD(put_Add)(IMyStruct* str);
  294.     STDMETHOD(get_Remove)(long idx, IMyStruct** str);
  295.     STDMETHOD(RemoveAll)();
  296.     STDMETHOD(First)();
  297.     STDMETHOD(Next)(IMyStruct** str, VARIANT_BOOL* b);
  298.     STDMETHOD(get_Count)(UINT* dw);
  299.  
  300.     CComPtr<IUnknown> m_pUnkDWordArray;
  301. };
  302.  
  303. class CStlPointArray :
  304.     public IStlPointArray,
  305.     public CComTearOffObjectBase<CStlArrays>
  306. {
  307. public:
  308.     CStlPointArray() {}
  309. BEGIN_COM_MAP(CStlPointArray)
  310.     COM_INTERFACE_ENTRY(IStlPointArray)
  311. END_COM_MAP()
  312.  
  313. DECLARE_REGISTRY_RESOURCEID(IDR_StlPointArray)
  314.  
  315.     deque<CPoint> m_array;
  316.     deque<CPoint>::iterator m_arrayiter;
  317.  
  318.     STDMETHOD(get_Array)(long idx, POINT* pt);
  319.     STDMETHOD(put_Array)(long idx, POINT pt);
  320.     STDMETHOD(put_Add)(POINT pt);
  321.     STDMETHOD(get_Remove)(long idx, POINT* pt);
  322.     STDMETHOD(RemoveAll)();
  323.     STDMETHOD(First)();
  324.     STDMETHOD(Next)(POINT* pt, VARIANT_BOOL* b);
  325.     STDMETHOD(get_Count)(UINT* dw);
  326.  
  327. };
  328.  
  329. class CStlArrays :
  330.     public IStlArrays,
  331.     public CStlMyObjectArray,
  332.     public CComCoClass<CStlArrays,&CLSID_CStlArrays>
  333. {
  334. public:
  335.     CStlArrays() {}
  336.  
  337.     void FinalRelease()
  338.     {
  339.         m_pUnkPointArray.Release();
  340.     }
  341.  
  342. BEGIN_COM_MAP(CStlArrays)
  343.     COM_INTERFACE_ENTRY(IStlArrays)
  344.     COM_INTERFACE_ENTRY_CHAIN(CStlMyObjectArray)
  345.     COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(IID_IStlPointArray, CStlPointArray, m_pUnkPointArray.p)
  346. END_COM_MAP()
  347.  
  348. DECLARE_REGISTRY_RESOURCEID(IDR_StlArrays)
  349. DECLARE_GET_CONTROLLING_UNKNOWN()
  350.  
  351.     CComPtr<IUnknown> m_pUnkPointArray;
  352. };
  353.