Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.67 KB | None | 0 0
  1. //#define DOCTEST_CONFIG_NO_RVALUE_REFERENCES
  2. #include "parts/doctest_fwd.h"
  3.  
  4. #include <vector>
  5. #include <utility>
  6. #include <iostream>
  7. #include <iomanip>
  8. #include <string>
  9.  
  10. #if defined(__GNUC__) && !defined(__clang__)
  11. #pragma GCC diagnostic ignored "-Weffc++"
  12. #pragma GCC diagnostic ignored "-Wmissing-declarations"
  13. #pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
  14. #pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant"
  15. #endif
  16.  
  17. #ifndef DOCTEST_CONFIG_NUM_CAPTURES_ON_STACK
  18. #define DOCTEST_CONFIG_NUM_CAPTURES_ON_STACK 5
  19. #endif // DOCTEST_CONFIG_NUM_CAPTURES_ON_STACK
  20.  
  21. namespace doctest {
  22. namespace detail {
  23. struct ICapture {
  24. virtual String toString() const = 0;
  25. };
  26.  
  27. std::vector<const ICapture*> captures;
  28.  
  29. void addToCaptures(const ICapture* ptr) { captures.push_back(ptr); }
  30. void popFromCaptures() { captures.pop_back(); }
  31.  
  32. struct InfoBuilder {
  33. template<typename T>
  34. struct Capture : ICapture {
  35. const T* capture;
  36.  
  37. Capture(const T* in)
  38. : capture(in)
  39. {}
  40. virtual String toString() const { // override
  41. return doctest::toString(*capture);
  42. }
  43. };
  44.  
  45. struct Chunk {
  46. char buf[sizeof(Capture<char>)]; // place to construct a Capture<T>
  47. };
  48.  
  49. struct Node {
  50. Chunk chunk;
  51. Node* next;
  52. };
  53.  
  54. Chunk stackChunks[DOCTEST_CONFIG_NUM_CAPTURES_ON_STACK];
  55. int numCaptures;
  56. Node* head;
  57.  
  58. InfoBuilder()
  59. : numCaptures(0)
  60. , head(0)
  61. {}
  62.  
  63. // copy the bytes for the whole object - including the vtable
  64. // cannot construct the object in the buffer using placement new - need the <new> header...
  65. template<typename T>
  66. static Capture<T>* copyChunk(Chunk& dest, Capture<T>& src) {
  67. for(unsigned i = 0; i < sizeof(Capture<char>); ++i)
  68. dest.buf[i] = reinterpret_cast<char*>(&src)[i];
  69. return reinterpret_cast<Capture<T>*>(dest.buf);
  70. }
  71.  
  72. template<typename T>
  73. InfoBuilder& operator<<(const T& in) {
  74. Capture<T> temp(&in);
  75.  
  76. if(numCaptures < DOCTEST_CONFIG_NUM_CAPTURES_ON_STACK) {
  77. addToCaptures(copyChunk(stackChunks[numCaptures], temp));
  78. } else {
  79. Node* curr = new Node;
  80. curr->next = head;
  81. head = curr;
  82. addToCaptures(copyChunk(head->chunk, temp));
  83. }
  84. ++numCaptures;
  85. return *this;
  86. }
  87.  
  88. #undef DOCTEST_COPY_CHUNK
  89.  
  90. ~InfoBuilder() {
  91. // pop all captures regardless of their location - stack or heap
  92. for(int i = 0; i < numCaptures; ++i)
  93. popFromCaptures();
  94. // free the linked list
  95. Node* curr = head;
  96. while(curr) {
  97. head = curr->next;
  98. delete curr;
  99. curr = head;
  100. }
  101. }
  102.  
  103. #ifdef DOCTEST_CONFIG_WITH_RVALUE_REFERENCES
  104. private:
  105. template<typename T>
  106. InfoBuilder& operator<<(const T&&);
  107. #endif // DOCTEST_CONFIG_WITH_RVALUE_REFERENCES
  108. };
  109. } // namespace detail
  110. } // namespace doctest
  111.  
  112. // TODO: varargs
  113.  
  114.  
  115. #ifdef DOCTEST_CONFIG_WITH_VARIADIC_MACROS
  116. #define DOCTEST_INFO_IMPL(name, ...) doctest::detail::InfoBuilder name; name << __VA_ARGS__
  117. #define DOCTEST_INFO(...) DOCTEST_INFO_IMPL(DOCTEST_ANONYMOUS(_DOCTEST_CAPTURE_), __VA_ARGS__)
  118. #else // DOCTEST_CONFIG_WITH_VARIADIC_MACROS
  119. #define DOCTEST_INFO_IMPL(name, x) doctest::detail::InfoBuilder name; name << x
  120. #define DOCTEST_INFO(x) DOCTEST_INFO_IMPL(DOCTEST_ANONYMOUS(_DOCTEST_CAPTURE_), x)
  121. #endif // DOCTEST_CONFIG_WITH_VARIADIC_MACROS
  122.  
  123. #define INFO DOCTEST_INFO
  124.  
  125. //static std::string f(const char* str) { return str; }
  126.  
  127. TEST_CASE("stuff") {
  128. int var = 42;
  129. int var2 = 43;
  130. int var3 = 45;
  131. int var4 = 46;
  132. int var5 = 47;
  133. float var6 = 48.f;
  134.  
  135. //INFO(std::pair<int, int>(5));
  136.  
  137. //doctest::detail::InfoBuilder name;
  138. //name << {1, 2};
  139. //name << (std::pair<int, int>(5));
  140.  
  141. INFO(var << var2 << var3 <<
  142. //std::pair<int, int>(5) <<
  143. "OMGOMGOMGOMGOMGGG" << var4 << var5 << var6 << "deymn!");
  144. //INFO(var);
  145. //INFO("omgomgomg");
  146. //INFO(f("std::string!"));
  147. //auto res = f("std::string!");
  148. //INFO(res);
  149. //auto res2 = &res;
  150. //INFO(res2);
  151.  
  152. for(size_t i = 0; i < doctest::detail::captures.size(); ++i) {
  153. doctest::String str = doctest::detail::captures[i]->toString();
  154. std::cout << str.c_str() << std::endl;
  155. }
  156.  
  157. CHECK(1 == 2);
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement