TarsDisplayer.h 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. /**
  2. * Tencent is pleased to support the open source community by making Tars available.
  3. *
  4. * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
  5. *
  6. * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
  7. * in compliance with the License. You may obtain a copy of the License at
  8. *
  9. * https://opensource.org/licenses/BSD-3-Clause
  10. *
  11. * Unless required by applicable law or agreed to in writing, software distributed
  12. * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
  13. * CONDITIONS OF ANY KIND, either express or implied. See the License for the
  14. * specific language governing permissions and limitations under the License.
  15. */
  16. #ifndef __TARS_DISPLAYER_H__
  17. #define __TARS_DISPLAYER_H__
  18. //#include <netinet/in.h>
  19. #include <iostream>
  20. #include <cassert>
  21. #include <vector>
  22. #include <map>
  23. #include <string>
  24. #include <stdexcept>
  25. #include <stdint.h>
  26. #include <string.h>
  27. #include <limits.h>
  28. //支持iphone
  29. #ifdef __APPLE__
  30. #include "TarsType.h"
  31. #else
  32. #include "tup/TarsType.h"
  33. #endif
  34. namespace tars
  35. {
  36. //////////////////////////////////////////////////////////////////////
  37. /// 用于输出
  38. class TarsDisplayer
  39. {
  40. std::ostream& _os;
  41. int _level;
  42. void ps(const char * fieldName)
  43. {
  44. for(int i = 0; i < _level; ++i)
  45. _os << '\t';
  46. if(fieldName != NULL)
  47. _os << fieldName << ": ";
  48. }
  49. public:
  50. explicit TarsDisplayer(std::ostream& os, int level = 0)
  51. : _os(os)
  52. , _level(level)
  53. {}
  54. TarsDisplayer& display(Bool b, const char * fieldName)
  55. {
  56. ps(fieldName);
  57. _os << (b ? 'T' : 'F') << std::endl;
  58. return *this;
  59. }
  60. TarsDisplayer& display(Char n, const char * fieldName)
  61. {
  62. ps(fieldName);
  63. _os << n << std::endl;
  64. return *this;
  65. }
  66. TarsDisplayer& display(UInt8 n, const char * fieldName)
  67. {
  68. ps(fieldName);
  69. _os << n << std::endl;
  70. return *this;
  71. }
  72. TarsDisplayer& display(Short n, const char * fieldName)
  73. {
  74. ps(fieldName);
  75. _os << n << std::endl;
  76. return *this;
  77. }
  78. TarsDisplayer& display(UInt16 n, const char * fieldName)
  79. {
  80. ps(fieldName);
  81. _os << n << std::endl;
  82. return *this;
  83. }
  84. TarsDisplayer& display(Int32 n, const char * fieldName)
  85. {
  86. ps(fieldName);
  87. _os << n << std::endl;
  88. return *this;
  89. }
  90. TarsDisplayer& display(UInt32 n, const char * fieldName)
  91. {
  92. ps(fieldName);
  93. _os << n << std::endl;
  94. return *this;
  95. }
  96. TarsDisplayer& display(Int64 n, const char * fieldName)
  97. {
  98. ps(fieldName);
  99. _os << n << std::endl;
  100. return *this;
  101. }
  102. TarsDisplayer& display(Float n, const char * fieldName)
  103. {
  104. ps(fieldName);
  105. _os << n << std::endl;
  106. return *this;
  107. }
  108. TarsDisplayer& display(Double n, const char * fieldName)
  109. {
  110. ps(fieldName);
  111. _os << n << std::endl;
  112. return *this;
  113. }
  114. TarsDisplayer& display(const std::string& s, const char * fieldName)
  115. {
  116. ps(fieldName);
  117. _os << s << std::endl;
  118. return *this;
  119. }
  120. TarsDisplayer& display(const char *s, const size_t len, const char * fieldName)
  121. {
  122. ps(fieldName);
  123. for(unsigned i=0;i< len; i++) {
  124. _os << s[i];
  125. }
  126. _os<<std::endl;
  127. return *this;
  128. }
  129. template <typename K, typename V, typename Cmp, typename Alloc >
  130. TarsDisplayer& display(const std::map<K, V, Cmp, Alloc>& m, const char * fieldName)
  131. {
  132. ps(fieldName);
  133. if(m.empty()){
  134. _os << m.size() << ", {}" << std::endl;
  135. return *this;
  136. }
  137. _os << m.size() << ", {" << std::endl;
  138. TarsDisplayer jd1(_os, _level + 1);
  139. TarsDisplayer jd(_os, _level + 2);
  140. typedef typename std::map<K, V, Cmp, Alloc>::const_iterator IT;
  141. IT f = m.begin(), l = m.end();
  142. for(; f != l; ++f){
  143. jd1.display('(', NULL);
  144. jd.display(f->first, NULL);
  145. jd.display(f->second, NULL);
  146. jd1.display(')', NULL);
  147. }
  148. display('}', NULL);
  149. return *this;
  150. }
  151. template < typename T, typename Alloc >
  152. TarsDisplayer& display(const std::vector<T, Alloc>& v, const char * fieldName)
  153. {
  154. ps(fieldName);
  155. if(v.empty()){
  156. _os << v.size() << ", []" << std::endl;
  157. return *this;
  158. }
  159. _os << v.size() << ", [" << std::endl;
  160. TarsDisplayer jd(_os, _level + 1);
  161. typedef typename std::vector<T, Alloc>::const_iterator IT;
  162. IT f = v.begin(), l = v.end();
  163. for(; f != l; ++f)
  164. jd.display(*f, NULL);
  165. display(']', NULL);
  166. return *this;
  167. }
  168. template < typename T >
  169. TarsDisplayer& display(const T * v, const size_t len ,const char * fieldName)
  170. {
  171. ps(fieldName);
  172. if(len == 0){
  173. _os << len << ", []" << std::endl;
  174. return *this;
  175. }
  176. _os << len << ", [" << std::endl;
  177. TarsDisplayer jd(_os, _level + 1);
  178. for(size_t i=0; i< len; ++i)
  179. jd.display(v[i], NULL);
  180. display(']', NULL);
  181. return *this;
  182. }
  183. template < typename T >
  184. TarsDisplayer& display(const T& v, const char * fieldName, typename detail::disable_if<detail::is_convertible<T*, TarsStructBase*>, void ***>::type dummy = 0)
  185. {
  186. return display((Int32) v, fieldName);
  187. }
  188. template < typename T >
  189. TarsDisplayer& display(const T& v, const char * fieldName, typename detail::enable_if<detail::is_convertible<T*, TarsStructBase*>, void ***>::type dummy = 0)
  190. {
  191. display('{', fieldName);
  192. v.display(_os, _level + 1);
  193. display('}', NULL);
  194. return *this;
  195. }
  196. TarsDisplayer& displaySimple(Bool b, bool bSep)
  197. {
  198. _os << (b ? 'T' : 'F') << (bSep ? "|" : "");
  199. return *this;
  200. }
  201. TarsDisplayer& displaySimple(Char n, bool bSep)
  202. {
  203. _os << n << (bSep ? "|" : "");
  204. return *this;
  205. }
  206. TarsDisplayer& displaySimple(UInt8 n, bool bSep)
  207. {
  208. _os << n << (bSep ? "|" : "");
  209. return *this;
  210. }
  211. TarsDisplayer& displaySimple(Short n, bool bSep)
  212. {
  213. _os << n << (bSep ? "|" : "");
  214. return *this;
  215. }
  216. TarsDisplayer& displaySimple(UInt16 n, bool bSep)
  217. {
  218. _os << n << (bSep ? "|" : "");
  219. return *this;
  220. }
  221. TarsDisplayer& displaySimple(Int32 n, bool bSep)
  222. {
  223. _os << n << (bSep ? "|" : "");
  224. return *this;
  225. }
  226. TarsDisplayer& displaySimple(UInt32 n, bool bSep)
  227. {
  228. _os << n << (bSep ? "|" : "");
  229. return *this;
  230. }
  231. TarsDisplayer& displaySimple(Int64 n, bool bSep)
  232. {
  233. _os << n << (bSep ? "|" : "");
  234. return *this;
  235. }
  236. TarsDisplayer& displaySimple(Float n, bool bSep)
  237. {
  238. _os << n << (bSep ? "|" : "");
  239. return *this;
  240. }
  241. TarsDisplayer& displaySimple(Double n, bool bSep)
  242. {
  243. _os << n << (bSep ? "|" : "");
  244. return *this;
  245. }
  246. TarsDisplayer& displaySimple(const std::string& n, bool bSep)
  247. {
  248. _os << n << (bSep ? "|" : "");
  249. return *this;
  250. }
  251. TarsDisplayer& displaySimple(const char * n, const size_t len, bool bSep)
  252. {
  253. for(unsigned i=0;i< len; i++) {
  254. _os << n[i] ;
  255. }
  256. _os<<(bSep ? "|" : "");
  257. return *this;
  258. }
  259. template <typename K, typename V, typename Cmp, typename Alloc >
  260. TarsDisplayer& displaySimple(const std::map<K, V, Cmp, Alloc>& m, bool bSep)
  261. {
  262. if(m.empty()){
  263. _os << m.size() << "{}";
  264. return *this;
  265. }
  266. _os << m.size() << "{";
  267. TarsDisplayer jd1(_os, _level + 1);
  268. TarsDisplayer jd(_os, _level + 2);
  269. typedef typename std::map<K, V, Cmp, Alloc>::const_iterator IT;
  270. IT f = m.begin(), l = m.end();
  271. for(; f != l; ++f){
  272. if(f != m.begin()) _os << ',';
  273. jd.displaySimple(f->first, true);
  274. jd.displaySimple(f->second, false);
  275. }
  276. _os << '}' << (bSep ? "|" : "");
  277. return *this;
  278. }
  279. template < typename T, typename Alloc >
  280. TarsDisplayer& displaySimple(const std::vector<T, Alloc>& v, bool bSep)
  281. {
  282. if(v.empty()){
  283. _os << v.size() << "{}";
  284. return *this;
  285. }
  286. _os << v.size() << '{';
  287. TarsDisplayer jd(_os, _level + 1);
  288. typedef typename std::vector<T, Alloc>::const_iterator IT;
  289. IT f = v.begin(), l = v.end();
  290. for(; f != l; ++f)
  291. {
  292. if(f != v.begin()) _os << "|";
  293. jd.displaySimple(*f, false);
  294. }
  295. _os << '}' << (bSep ? "|" : "");
  296. return *this;
  297. }
  298. template < typename T>
  299. TarsDisplayer& displaySimple(const T* v, const size_t len, bool bSep)
  300. {
  301. if(len == 0){
  302. _os << len << "{}";
  303. return *this;
  304. }
  305. _os << len << '{';
  306. TarsDisplayer jd(_os, _level + 1);
  307. for(size_t i=0; i <len ; ++i)
  308. {
  309. if(i != 0) _os << "|";
  310. jd.displaySimple(v[i], false);
  311. }
  312. _os << '}' << (bSep ? "|" : "");
  313. return *this;
  314. }
  315. template < typename T >
  316. TarsDisplayer& displaySimple(const T& v, bool bSep, typename detail::disable_if<detail::is_convertible<T*, TarsStructBase*>, void ***>::type dummy = 0)
  317. {
  318. return displaySimple((Int32) v, bSep);
  319. }
  320. template < typename T >
  321. TarsDisplayer& displaySimple(const T& v, bool bSep, typename detail::enable_if<detail::is_convertible<T*, TarsStructBase*>, void ***>::type dummy = 0)
  322. {
  323. _os << "{";
  324. v.displaySimple(_os, _level + 1);
  325. _os << "}" << (bSep ? "|" : "");
  326. return *this;
  327. }
  328. };
  329. ////////////////////////////////////////////////////////////////////////////////////////////////////
  330. }
  331. #endif