Val.cpp
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:4k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // Val.cpp: implementation of the CVal class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "testBT.h"
  6. #include "Val.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CVal::CVal(long lSrc)
  16. {
  17. vt = VT_LONG;
  18. lVal = lSrc;
  19. }
  20. CVal::CVal(string strSrc)
  21. {
  22. setBuf((char*)strSrc.data(), strSrc.size());
  23. }
  24. CVal::CVal(char* pstrSrc, long lstrLenSrc)
  25. {
  26. setBuf(pstrSrc, lstrLenSrc);
  27. }
  28. void CVal::setBuf(char* pstrSrc, long lstrLenSrc)
  29. {
  30. assert(lstrLenSrc >= 0);
  31. vt = VT_PSTR;
  32. pstrVal = new char[lstrLenSrc + 1];
  33. pstrVal [lstrLenSrc] = 0;
  34. memcpy(pstrVal, pstrSrc, lstrLenSrc);
  35. // pstrVal = pstrSrc;
  36. lstrLen = lstrLenSrc;
  37. }
  38. CVal::CVal(PVALMAP pmapSrc)
  39. {
  40. vt = VT_PMAP;
  41. pmapVal = pmapSrc;
  42. }
  43. CVal::CVal(PVALLIST plistSrc)
  44. {
  45. vt = VT_PLIST;
  46. plistVal= plistSrc;
  47. }
  48. CVal::~CVal()
  49. {
  50. switch(vt)
  51. {
  52. case VT_LONG:
  53. break;
  54. case VT_PSTR:
  55. {
  56. // ShowMessage(pstrVal);
  57. delete [] pstrVal;
  58. }
  59. break;
  60. case VT_PMAP:
  61. {
  62. VALMAP::iterator iter = pmapVal->begin();
  63. while(iter != pmapVal->end())
  64. {
  65. // ShowMessage(*(*iter).second);
  66. delete (*iter).second;
  67. iter++;
  68. }
  69. delete pmapVal;
  70. }
  71. break;
  72. case VT_PLIST:
  73. {
  74. VALLIST::iterator iter = plistVal->begin();
  75. while(iter != plistVal->end())
  76. {
  77. // ShowMessage(*(*iter));
  78. delete *iter;
  79. iter++;
  80. }
  81. delete plistVal;
  82. }
  83. break;
  84. }
  85. }
  86. CVal& CVal::operator = (CVal& v)
  87. {
  88. vt = v.vt;
  89. lVal = v.lVal;
  90. pstrVal = v.pstrVal;
  91. pmapVal = v.pmapVal;
  92. plistVal = v.plistVal;
  93. return *this;
  94. }
  95. /*
  96. CVal::operator string() const
  97. {
  98. char szMsg[100] = {0};
  99. switch(vt)
  100. {
  101. case VT_LONG:
  102. sprintf(szMsg, "long:");
  103. break;
  104. case VT_PSTR:
  105. {
  106. sprintf(szMsg, "string:");
  107. }
  108. break;
  109. case VT_PMAP:
  110. {
  111. sprintf(szMsg, "map:");
  112. }
  113. break;
  114. case VT_PLIST:
  115. {
  116. sprintf(szMsg, "list:");
  117. }
  118. break;
  119. }
  120. return string(szMsg);
  121. }
  122. //*/
  123. /*
  124. CVal::operator long()const
  125. {
  126. if (vt != VT_LONG)
  127. throw string("operator[] error: not a long type");
  128. return lVal;
  129. }
  130. //*/
  131. CVal::operator char*()const
  132. {
  133. if (vt != VT_PSTR)
  134. throw string("operator[] error: not a VT_PSTR type");
  135. assert(pstrVal [lstrLen] == 0);
  136. return pstrVal;
  137. }
  138. long CVal::size()
  139. {
  140. if (vt == VT_PMAP)
  141. return pmapVal->size();
  142. if (vt == VT_PLIST)
  143. return plistVal->size();
  144. throw string("size() error: not a map or list object");
  145. }
  146. CVal* CVal::operator [](string strKey)
  147. {
  148. if (vt != VT_PMAP)
  149. throw string("operator[] error: not a map object");
  150. VALMAP::iterator iter = pmapVal->find(strKey);
  151. if (iter == pmapVal->end())
  152. throw string("operator[](string strKey) error : not find key (") + strKey + ")";
  153. return (*iter).second;
  154. }
  155. CVal* CVal::operator [](int inx)
  156. {
  157. if (vt != VT_PLIST)
  158. throw string("operator[] error: not a list object");
  159. if (inx >= plistVal->size() || inx < 0)
  160. throw string("operator[](int inx) error : inx out of range list ");
  161. return (*plistVal)[inx];
  162. }
  163. void CVal::test()
  164. {
  165. VALMAP* pmv = new VALMAP;
  166. (*pmv)["sdfd"] = new CVal(10);
  167. VALLIST* plv = new VALLIST();
  168. plv->push_back(new CVal(100));
  169. (*pmv)["zzz"] = new CVal(plv);
  170. CVal* pv = new CVal(pmv);
  171. VALMAP m = VALMAP();
  172. m["l"] = pv;
  173. delete pv;
  174. }