BfCommon.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. #pragma once
  2. #include "BeefySysLib/Common.h"
  3. #include "BeefySysLib/util/SizedArray.h"
  4. #include "BeefySysLib/util/TLSingleton.h"
  5. #include "BeefySysLib/util/String.h"
  6. #include "BeefySysLib/util/BumpAllocator.h"
  7. #pragma warning(push)
  8. #pragma warning(disable:4141)
  9. #pragma warning(disable:4146)
  10. #pragma warning(disable:4291)
  11. #pragma warning(disable:4244)
  12. #pragma warning(disable:4267)
  13. #pragma warning(disable:4624)
  14. #pragma warning(disable:4800)
  15. #pragma warning(disable:4996)
  16. #include "llvm/ADT/SmallVector.h"
  17. #pragma warning(pop)
  18. NS_BF_BEGIN
  19. template <typename T, unsigned int N>
  20. using BfSizedVector = llvm::SmallVector<T, N>;
  21. template <typename T>
  22. using BfSizedVectorRef = llvm::SmallVectorImpl<T>;
  23. template <typename T>
  24. class BfSizedArray
  25. {
  26. public:
  27. T* mVals;
  28. int mSize;
  29. public:
  30. struct Iterator
  31. {
  32. public:
  33. T* mPtr;
  34. public:
  35. Iterator(T* ptr)
  36. {
  37. mPtr = ptr;
  38. }
  39. Iterator& operator++()
  40. {
  41. mPtr++;
  42. return *this;
  43. }
  44. bool operator!=(const Iterator& itr) const
  45. {
  46. return itr.mPtr != mPtr;
  47. }
  48. bool operator==(const Iterator& itr) const
  49. {
  50. return itr.mPtr == mPtr;
  51. }
  52. T& operator*()
  53. {
  54. return *mPtr;
  55. }
  56. };
  57. BfSizedArray()
  58. {
  59. mSize = 0;
  60. mVals = NULL;
  61. }
  62. BfSizedArray(const llvm::SmallVectorImpl<T>& refVec)
  63. {
  64. mSize = (int)refVec.size();
  65. if (mSize > 0)
  66. mVals = (T*)&refVec[0];
  67. else
  68. mVals = NULL;
  69. }
  70. BfSizedArray(const Array<T>& refVec)
  71. {
  72. mSize = (int)refVec.size();
  73. if (mSize > 0)
  74. mVals = (T*)&refVec[0];
  75. else
  76. mVals = NULL;
  77. }
  78. BfSizedArray(const SizedArrayImpl<T>& refVec)
  79. {
  80. mSize = (int)refVec.size();
  81. if (mSize > 0)
  82. mVals = (T*)&refVec[0];
  83. else
  84. mVals = NULL;
  85. }
  86. void CopyFrom(T* vals, int size, BumpAllocator& bumpAlloc)
  87. {
  88. mVals = (T*)bumpAlloc.AllocBytes(sizeof(T) * size, alignof(T));
  89. mSize = size;
  90. memcpy(mVals, vals, sizeof(T) * size);
  91. }
  92. T& operator[](int idx) const
  93. {
  94. BF_ASSERT((uint)idx < (uint)mSize);
  95. return mVals[idx];
  96. }
  97. void GetSafe(intptr idx, T& val)
  98. {
  99. if ((idx < 0) || (idx >= mSize))
  100. return;
  101. val = mVals[idx];
  102. }
  103. T GetSafe(intptr idx)
  104. {
  105. if ((idx < 0) || (idx >= mSize))
  106. return T();
  107. return mVals[idx];
  108. }
  109. Iterator begin() const
  110. {
  111. return mVals;
  112. }
  113. Iterator end() const
  114. {
  115. return mVals + mSize;
  116. }
  117. T back() const
  118. {
  119. return mVals[mSize - 1];
  120. }
  121. int size() const
  122. {
  123. return mSize;
  124. }
  125. bool empty() const
  126. {
  127. return mSize == 0;
  128. }
  129. bool IsEmpty() const
  130. {
  131. return mSize == 0;
  132. }
  133. T Get(int idx)
  134. {
  135. if ((idx < 0) || (idx >= mSize))
  136. return (T)0;
  137. return mVals[idx];
  138. }
  139. template <typename T2>
  140. T2 GetAs(int idx)
  141. {
  142. if ((idx < 0) || (idx >= mSize))
  143. return (T2)0;
  144. return (T2)mVals[idx];
  145. }
  146. T GetLast()
  147. {
  148. if (mSize == 0)
  149. return (T)0;
  150. return mVals[mSize - 1];
  151. }
  152. T GetFirst()
  153. {
  154. if (mSize == 0)
  155. return (T)0;
  156. return mVals[0];
  157. }
  158. /*void Init(const llvm::SmallVectorImpl<T>& vec, BfAstAllocator* alloc)
  159. {
  160. mSize = (int)vec.size();
  161. if (mSize > 0)
  162. {
  163. mVals = (T*)alloc->AllocBytes(mSize * sizeof(T), sizeof(T));
  164. memcpy(mVals, &vec[0], mSize * sizeof(T));
  165. }
  166. }
  167. template <typename T2>
  168. void InitIndirect(const llvm::SmallVectorImpl<T2>& vec, BfAstAllocator* alloc)
  169. {
  170. mSize = (int)vec.size();
  171. if (mSize > 0)
  172. {
  173. mVals = (T*)alloc->AllocBytes(mSize * sizeof(T), sizeof(T));
  174. for (int i = 0; i < mSize; i++)
  175. mVals[i] = vec[i];
  176. }
  177. }*/
  178. void SetSize(int size)
  179. {
  180. BF_ASSERT(size <= mSize);
  181. mSize = size;
  182. }
  183. };
  184. class ChunkedDataBuffer;
  185. class BfIRCodeGenBase
  186. {
  187. public:
  188. ChunkedDataBuffer* mStream;
  189. int mPtrSize;
  190. bool mIsOptimized;
  191. bool mFailed;
  192. String mErrorMsg;
  193. public:
  194. BfIRCodeGenBase()
  195. {
  196. mStream = NULL;
  197. mPtrSize = -1;
  198. mIsOptimized = false;
  199. mFailed = false;
  200. }
  201. virtual void Fail(const StringImpl& error)
  202. {
  203. if (mErrorMsg.IsEmpty())
  204. mErrorMsg = error;
  205. mFailed = true;
  206. }
  207. virtual ~BfIRCodeGenBase() {}
  208. virtual void ProcessBfIRData(const BfSizedArray<uint8>& buffer) = 0;
  209. virtual void HandleNextCmd() = 0;
  210. virtual void SetConfigConst(int idx, int value) = 0;
  211. };
  212. extern TLSingleton<String> gTLStrReturn;
  213. extern TLSingleton<String> gTLStrReturn2;
  214. template <typename T>
  215. struct OwnedWrapper
  216. {
  217. public:
  218. T* mValue;
  219. OwnedWrapper()
  220. {
  221. mValue = NULL;
  222. }
  223. OwnedWrapper(const T* value)
  224. {
  225. mValue = (T*)value;
  226. }
  227. OwnedWrapper(const T& value)
  228. {
  229. mValue = (T*)&value;
  230. }
  231. bool operator==(const OwnedWrapper& rhs)
  232. {
  233. return *mValue == *rhs.mValue;
  234. }
  235. };
  236. NS_BF_END
  237. namespace std
  238. {
  239. template <typename T>
  240. struct hash<Beefy::OwnedWrapper<T> >
  241. {
  242. size_t operator()(const Beefy::OwnedWrapper<T>& val) const
  243. {
  244. return std::hash<T>()(*val.mValue);
  245. }
  246. };
  247. }