ConstantUnion.h 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974
  1. //
  2. // Copyright (C) 2002-2005 3Dlabs Inc. Ltd.
  3. // Copyright (C) 2013 LunarG, Inc.
  4. // Copyright (C) 2017 ARM Limited.
  5. //
  6. // All rights reserved.
  7. //
  8. // Redistribution and use in source and binary forms, with or without
  9. // modification, are permitted provided that the following conditions
  10. // are met:
  11. //
  12. // Redistributions of source code must retain the above copyright
  13. // notice, this list of conditions and the following disclaimer.
  14. //
  15. // Redistributions in binary form must reproduce the above
  16. // copyright notice, this list of conditions and the following
  17. // disclaimer in the documentation and/or other materials provided
  18. // with the distribution.
  19. //
  20. // Neither the name of 3Dlabs Inc. Ltd. nor the names of its
  21. // contributors may be used to endorse or promote products derived
  22. // from this software without specific prior written permission.
  23. //
  24. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  25. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  26. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  27. // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  28. // COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  29. // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  30. // BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  31. // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  32. // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  33. // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  34. // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  35. // POSSIBILITY OF SUCH DAMAGE.
  36. //
  37. #ifndef _CONSTANT_UNION_INCLUDED_
  38. #define _CONSTANT_UNION_INCLUDED_
  39. #include "../Include/Common.h"
  40. #include "../Include/BaseTypes.h"
  41. namespace glslang {
  42. class TConstUnion {
  43. public:
  44. POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())
  45. TConstUnion() : iConst(0), type(EbtInt) { }
  46. void setI8Const(signed char i)
  47. {
  48. i8Const = i;
  49. type = EbtInt8;
  50. }
  51. void setU8Const(unsigned char u)
  52. {
  53. u8Const = u;
  54. type = EbtUint8;
  55. }
  56. void setI16Const(signed short i)
  57. {
  58. i16Const = i;
  59. type = EbtInt16;
  60. }
  61. void setU16Const(unsigned short u)
  62. {
  63. u16Const = u;
  64. type = EbtUint16;
  65. }
  66. void setIConst(int i)
  67. {
  68. iConst = i;
  69. type = EbtInt;
  70. }
  71. void setUConst(unsigned int u)
  72. {
  73. uConst = u;
  74. type = EbtUint;
  75. }
  76. void setI64Const(long long i64)
  77. {
  78. i64Const = i64;
  79. type = EbtInt64;
  80. }
  81. void setU64Const(unsigned long long u64)
  82. {
  83. u64Const = u64;
  84. type = EbtUint64;
  85. }
  86. void setDConst(double d)
  87. {
  88. dConst = d;
  89. type = EbtDouble;
  90. }
  91. void setBConst(bool b)
  92. {
  93. bConst = b;
  94. type = EbtBool;
  95. }
  96. void setSConst(const TString* s)
  97. {
  98. sConst = s;
  99. type = EbtString;
  100. }
  101. signed char getI8Const() const { return i8Const; }
  102. unsigned char getU8Const() const { return u8Const; }
  103. signed short getI16Const() const { return i16Const; }
  104. unsigned short getU16Const() const { return u16Const; }
  105. int getIConst() const { return iConst; }
  106. unsigned int getUConst() const { return uConst; }
  107. long long getI64Const() const { return i64Const; }
  108. unsigned long long getU64Const() const { return u64Const; }
  109. double getDConst() const { return dConst; }
  110. bool getBConst() const { return bConst; }
  111. const TString* getSConst() const { return sConst; }
  112. bool operator==(const signed char i) const
  113. {
  114. if (i == i8Const)
  115. return true;
  116. return false;
  117. }
  118. bool operator==(const unsigned char u) const
  119. {
  120. if (u == u8Const)
  121. return true;
  122. return false;
  123. }
  124. bool operator==(const signed short i) const
  125. {
  126. if (i == i16Const)
  127. return true;
  128. return false;
  129. }
  130. bool operator==(const unsigned short u) const
  131. {
  132. if (u == u16Const)
  133. return true;
  134. return false;
  135. }
  136. bool operator==(const int i) const
  137. {
  138. if (i == iConst)
  139. return true;
  140. return false;
  141. }
  142. bool operator==(const unsigned int u) const
  143. {
  144. if (u == uConst)
  145. return true;
  146. return false;
  147. }
  148. bool operator==(const long long i64) const
  149. {
  150. if (i64 == i64Const)
  151. return true;
  152. return false;
  153. }
  154. bool operator==(const unsigned long long u64) const
  155. {
  156. if (u64 == u64Const)
  157. return true;
  158. return false;
  159. }
  160. bool operator==(const double d) const
  161. {
  162. if (d == dConst)
  163. return true;
  164. return false;
  165. }
  166. bool operator==(const bool b) const
  167. {
  168. if (b == bConst)
  169. return true;
  170. return false;
  171. }
  172. bool operator==(const TConstUnion& constant) const
  173. {
  174. if (constant.type != type)
  175. return false;
  176. switch (type) {
  177. case EbtInt:
  178. if (constant.iConst == iConst)
  179. return true;
  180. break;
  181. case EbtUint:
  182. if (constant.uConst == uConst)
  183. return true;
  184. break;
  185. case EbtBool:
  186. if (constant.bConst == bConst)
  187. return true;
  188. break;
  189. case EbtDouble:
  190. if (constant.dConst == dConst)
  191. return true;
  192. break;
  193. #ifndef GLSLANG_WEB
  194. case EbtInt16:
  195. if (constant.i16Const == i16Const)
  196. return true;
  197. break;
  198. case EbtUint16:
  199. if (constant.u16Const == u16Const)
  200. return true;
  201. break;
  202. case EbtInt8:
  203. if (constant.i8Const == i8Const)
  204. return true;
  205. break;
  206. case EbtUint8:
  207. if (constant.u8Const == u8Const)
  208. return true;
  209. break;
  210. case EbtInt64:
  211. if (constant.i64Const == i64Const)
  212. return true;
  213. break;
  214. case EbtUint64:
  215. if (constant.u64Const == u64Const)
  216. return true;
  217. break;
  218. #endif
  219. default:
  220. assert(false && "Default missing");
  221. }
  222. return false;
  223. }
  224. bool operator!=(const signed char i) const
  225. {
  226. return !operator==(i);
  227. }
  228. bool operator!=(const unsigned char u) const
  229. {
  230. return !operator==(u);
  231. }
  232. bool operator!=(const signed short i) const
  233. {
  234. return !operator==(i);
  235. }
  236. bool operator!=(const unsigned short u) const
  237. {
  238. return !operator==(u);
  239. }
  240. bool operator!=(const int i) const
  241. {
  242. return !operator==(i);
  243. }
  244. bool operator!=(const unsigned int u) const
  245. {
  246. return !operator==(u);
  247. }
  248. bool operator!=(const long long i) const
  249. {
  250. return !operator==(i);
  251. }
  252. bool operator!=(const unsigned long long u) const
  253. {
  254. return !operator==(u);
  255. }
  256. bool operator!=(const float f) const
  257. {
  258. return !operator==(f);
  259. }
  260. bool operator!=(const bool b) const
  261. {
  262. return !operator==(b);
  263. }
  264. bool operator!=(const TConstUnion& constant) const
  265. {
  266. return !operator==(constant);
  267. }
  268. bool operator>(const TConstUnion& constant) const
  269. {
  270. assert(type == constant.type);
  271. switch (type) {
  272. case EbtInt:
  273. if (iConst > constant.iConst)
  274. return true;
  275. return false;
  276. case EbtUint:
  277. if (uConst > constant.uConst)
  278. return true;
  279. return false;
  280. case EbtDouble:
  281. if (dConst > constant.dConst)
  282. return true;
  283. return false;
  284. #ifndef GLSLANG_WEB
  285. case EbtInt8:
  286. if (i8Const > constant.i8Const)
  287. return true;
  288. return false;
  289. case EbtUint8:
  290. if (u8Const > constant.u8Const)
  291. return true;
  292. return false;
  293. case EbtInt16:
  294. if (i16Const > constant.i16Const)
  295. return true;
  296. return false;
  297. case EbtUint16:
  298. if (u16Const > constant.u16Const)
  299. return true;
  300. return false;
  301. case EbtInt64:
  302. if (i64Const > constant.i64Const)
  303. return true;
  304. return false;
  305. case EbtUint64:
  306. if (u64Const > constant.u64Const)
  307. return true;
  308. return false;
  309. #endif
  310. default:
  311. assert(false && "Default missing");
  312. return false;
  313. }
  314. }
  315. bool operator<(const TConstUnion& constant) const
  316. {
  317. assert(type == constant.type);
  318. switch (type) {
  319. #ifndef GLSLANG_WEB
  320. case EbtInt8:
  321. if (i8Const < constant.i8Const)
  322. return true;
  323. return false;
  324. case EbtUint8:
  325. if (u8Const < constant.u8Const)
  326. return true;
  327. return false;
  328. case EbtInt16:
  329. if (i16Const < constant.i16Const)
  330. return true;
  331. return false;
  332. case EbtUint16:
  333. if (u16Const < constant.u16Const)
  334. return true;
  335. return false;
  336. case EbtInt64:
  337. if (i64Const < constant.i64Const)
  338. return true;
  339. return false;
  340. case EbtUint64:
  341. if (u64Const < constant.u64Const)
  342. return true;
  343. return false;
  344. #endif
  345. case EbtDouble:
  346. if (dConst < constant.dConst)
  347. return true;
  348. return false;
  349. case EbtInt:
  350. if (iConst < constant.iConst)
  351. return true;
  352. return false;
  353. case EbtUint:
  354. if (uConst < constant.uConst)
  355. return true;
  356. return false;
  357. default:
  358. assert(false && "Default missing");
  359. return false;
  360. }
  361. }
  362. TConstUnion operator+(const TConstUnion& constant) const
  363. {
  364. TConstUnion returnValue;
  365. assert(type == constant.type);
  366. switch (type) {
  367. case EbtInt: returnValue.setIConst(iConst + constant.iConst); break;
  368. case EbtUint: returnValue.setUConst(uConst + constant.uConst); break;
  369. case EbtDouble: returnValue.setDConst(dConst + constant.dConst); break;
  370. #ifndef GLSLANG_WEB
  371. case EbtInt8: returnValue.setI8Const(i8Const + constant.i8Const); break;
  372. case EbtInt16: returnValue.setI16Const(i16Const + constant.i16Const); break;
  373. case EbtInt64: returnValue.setI64Const(i64Const + constant.i64Const); break;
  374. case EbtUint8: returnValue.setU8Const(u8Const + constant.u8Const); break;
  375. case EbtUint16: returnValue.setU16Const(u16Const + constant.u16Const); break;
  376. case EbtUint64: returnValue.setU64Const(u64Const + constant.u64Const); break;
  377. #endif
  378. default: assert(false && "Default missing");
  379. }
  380. return returnValue;
  381. }
  382. TConstUnion operator-(const TConstUnion& constant) const
  383. {
  384. TConstUnion returnValue;
  385. assert(type == constant.type);
  386. switch (type) {
  387. case EbtInt: returnValue.setIConst(iConst - constant.iConst); break;
  388. case EbtUint: returnValue.setUConst(uConst - constant.uConst); break;
  389. case EbtDouble: returnValue.setDConst(dConst - constant.dConst); break;
  390. #ifndef GLSLANG_WEB
  391. case EbtInt8: returnValue.setI8Const(i8Const - constant.i8Const); break;
  392. case EbtInt16: returnValue.setI16Const(i16Const - constant.i16Const); break;
  393. case EbtInt64: returnValue.setI64Const(i64Const - constant.i64Const); break;
  394. case EbtUint8: returnValue.setU8Const(u8Const - constant.u8Const); break;
  395. case EbtUint16: returnValue.setU16Const(u16Const - constant.u16Const); break;
  396. case EbtUint64: returnValue.setU64Const(u64Const - constant.u64Const); break;
  397. #endif
  398. default: assert(false && "Default missing");
  399. }
  400. return returnValue;
  401. }
  402. TConstUnion operator*(const TConstUnion& constant) const
  403. {
  404. TConstUnion returnValue;
  405. assert(type == constant.type);
  406. switch (type) {
  407. case EbtInt: returnValue.setIConst(iConst * constant.iConst); break;
  408. case EbtUint: returnValue.setUConst(uConst * constant.uConst); break;
  409. case EbtDouble: returnValue.setDConst(dConst * constant.dConst); break;
  410. #ifndef GLSLANG_WEB
  411. case EbtInt8: returnValue.setI8Const(i8Const * constant.i8Const); break;
  412. case EbtInt16: returnValue.setI16Const(i16Const * constant.i16Const); break;
  413. case EbtInt64: returnValue.setI64Const(i64Const * constant.i64Const); break;
  414. case EbtUint8: returnValue.setU8Const(u8Const * constant.u8Const); break;
  415. case EbtUint16: returnValue.setU16Const(u16Const * constant.u16Const); break;
  416. case EbtUint64: returnValue.setU64Const(u64Const * constant.u64Const); break;
  417. #endif
  418. default: assert(false && "Default missing");
  419. }
  420. return returnValue;
  421. }
  422. TConstUnion operator%(const TConstUnion& constant) const
  423. {
  424. TConstUnion returnValue;
  425. assert(type == constant.type);
  426. switch (type) {
  427. case EbtInt: returnValue.setIConst(iConst % constant.iConst); break;
  428. case EbtUint: returnValue.setUConst(uConst % constant.uConst); break;
  429. #ifndef GLSLANG_WEB
  430. case EbtInt8: returnValue.setI8Const(i8Const % constant.i8Const); break;
  431. case EbtInt16: returnValue.setI8Const(i8Const % constant.i16Const); break;
  432. case EbtInt64: returnValue.setI64Const(i64Const % constant.i64Const); break;
  433. case EbtUint8: returnValue.setU8Const(u8Const % constant.u8Const); break;
  434. case EbtUint16: returnValue.setU16Const(u16Const % constant.u16Const); break;
  435. case EbtUint64: returnValue.setU64Const(u64Const % constant.u64Const); break;
  436. #endif
  437. default: assert(false && "Default missing");
  438. }
  439. return returnValue;
  440. }
  441. TConstUnion operator>>(const TConstUnion& constant) const
  442. {
  443. TConstUnion returnValue;
  444. switch (type) {
  445. #ifndef GLSLANG_WEB
  446. case EbtInt8:
  447. switch (constant.type) {
  448. case EbtInt8: returnValue.setI8Const(i8Const >> constant.i8Const); break;
  449. case EbtUint8: returnValue.setI8Const(i8Const >> constant.u8Const); break;
  450. case EbtInt16: returnValue.setI8Const(i8Const >> constant.i16Const); break;
  451. case EbtUint16: returnValue.setI8Const(i8Const >> constant.u16Const); break;
  452. case EbtInt: returnValue.setI8Const(i8Const >> constant.iConst); break;
  453. case EbtUint: returnValue.setI8Const(i8Const >> constant.uConst); break;
  454. case EbtInt64: returnValue.setI8Const(i8Const >> constant.i64Const); break;
  455. case EbtUint64: returnValue.setI8Const(i8Const >> constant.u64Const); break;
  456. default: assert(false && "Default missing");
  457. }
  458. break;
  459. case EbtUint8:
  460. switch (constant.type) {
  461. case EbtInt8: returnValue.setU8Const(u8Const >> constant.i8Const); break;
  462. case EbtUint8: returnValue.setU8Const(u8Const >> constant.u8Const); break;
  463. case EbtInt16: returnValue.setU8Const(u8Const >> constant.i16Const); break;
  464. case EbtUint16: returnValue.setU8Const(u8Const >> constant.u16Const); break;
  465. case EbtInt: returnValue.setU8Const(u8Const >> constant.iConst); break;
  466. case EbtUint: returnValue.setU8Const(u8Const >> constant.uConst); break;
  467. case EbtInt64: returnValue.setU8Const(u8Const >> constant.i64Const); break;
  468. case EbtUint64: returnValue.setU8Const(u8Const >> constant.u64Const); break;
  469. default: assert(false && "Default missing");
  470. }
  471. break;
  472. case EbtInt16:
  473. switch (constant.type) {
  474. case EbtInt8: returnValue.setI16Const(i16Const >> constant.i8Const); break;
  475. case EbtUint8: returnValue.setI16Const(i16Const >> constant.u8Const); break;
  476. case EbtInt16: returnValue.setI16Const(i16Const >> constant.i16Const); break;
  477. case EbtUint16: returnValue.setI16Const(i16Const >> constant.u16Const); break;
  478. case EbtInt: returnValue.setI16Const(i16Const >> constant.iConst); break;
  479. case EbtUint: returnValue.setI16Const(i16Const >> constant.uConst); break;
  480. case EbtInt64: returnValue.setI16Const(i16Const >> constant.i64Const); break;
  481. case EbtUint64: returnValue.setI16Const(i16Const >> constant.u64Const); break;
  482. default: assert(false && "Default missing");
  483. }
  484. break;
  485. case EbtUint16:
  486. switch (constant.type) {
  487. case EbtInt8: returnValue.setU16Const(u16Const >> constant.i8Const); break;
  488. case EbtUint8: returnValue.setU16Const(u16Const >> constant.u8Const); break;
  489. case EbtInt16: returnValue.setU16Const(u16Const >> constant.i16Const); break;
  490. case EbtUint16: returnValue.setU16Const(u16Const >> constant.u16Const); break;
  491. case EbtInt: returnValue.setU16Const(u16Const >> constant.iConst); break;
  492. case EbtUint: returnValue.setU16Const(u16Const >> constant.uConst); break;
  493. case EbtInt64: returnValue.setU16Const(u16Const >> constant.i64Const); break;
  494. case EbtUint64: returnValue.setU16Const(u16Const >> constant.u64Const); break;
  495. default: assert(false && "Default missing");
  496. }
  497. break;
  498. #endif
  499. case EbtInt:
  500. switch (constant.type) {
  501. case EbtInt: returnValue.setIConst(iConst >> constant.iConst); break;
  502. case EbtUint: returnValue.setIConst(iConst >> constant.uConst); break;
  503. #ifndef GLSLANG_WEB
  504. case EbtInt8: returnValue.setIConst(iConst >> constant.i8Const); break;
  505. case EbtUint8: returnValue.setIConst(iConst >> constant.u8Const); break;
  506. case EbtInt16: returnValue.setIConst(iConst >> constant.i16Const); break;
  507. case EbtUint16: returnValue.setIConst(iConst >> constant.u16Const); break;
  508. case EbtInt64: returnValue.setIConst(iConst >> constant.i64Const); break;
  509. case EbtUint64: returnValue.setIConst(iConst >> constant.u64Const); break;
  510. #endif
  511. default: assert(false && "Default missing");
  512. }
  513. break;
  514. case EbtUint:
  515. switch (constant.type) {
  516. case EbtInt: returnValue.setUConst(uConst >> constant.iConst); break;
  517. case EbtUint: returnValue.setUConst(uConst >> constant.uConst); break;
  518. #ifndef GLSLANG_WEB
  519. case EbtInt8: returnValue.setUConst(uConst >> constant.i8Const); break;
  520. case EbtUint8: returnValue.setUConst(uConst >> constant.u8Const); break;
  521. case EbtInt16: returnValue.setUConst(uConst >> constant.i16Const); break;
  522. case EbtUint16: returnValue.setUConst(uConst >> constant.u16Const); break;
  523. case EbtInt64: returnValue.setUConst(uConst >> constant.i64Const); break;
  524. case EbtUint64: returnValue.setUConst(uConst >> constant.u64Const); break;
  525. #endif
  526. default: assert(false && "Default missing");
  527. }
  528. break;
  529. #ifndef GLSLANG_WEB
  530. case EbtInt64:
  531. switch (constant.type) {
  532. case EbtInt8: returnValue.setI64Const(i64Const >> constant.i8Const); break;
  533. case EbtUint8: returnValue.setI64Const(i64Const >> constant.u8Const); break;
  534. case EbtInt16: returnValue.setI64Const(i64Const >> constant.i16Const); break;
  535. case EbtUint16: returnValue.setI64Const(i64Const >> constant.u16Const); break;
  536. case EbtInt: returnValue.setI64Const(i64Const >> constant.iConst); break;
  537. case EbtUint: returnValue.setI64Const(i64Const >> constant.uConst); break;
  538. case EbtInt64: returnValue.setI64Const(i64Const >> constant.i64Const); break;
  539. case EbtUint64: returnValue.setI64Const(i64Const >> constant.u64Const); break;
  540. default: assert(false && "Default missing");
  541. }
  542. break;
  543. case EbtUint64:
  544. switch (constant.type) {
  545. case EbtInt8: returnValue.setU64Const(u64Const >> constant.i8Const); break;
  546. case EbtUint8: returnValue.setU64Const(u64Const >> constant.u8Const); break;
  547. case EbtInt16: returnValue.setU64Const(u64Const >> constant.i16Const); break;
  548. case EbtUint16: returnValue.setU64Const(u64Const >> constant.u16Const); break;
  549. case EbtInt: returnValue.setU64Const(u64Const >> constant.iConst); break;
  550. case EbtUint: returnValue.setU64Const(u64Const >> constant.uConst); break;
  551. case EbtInt64: returnValue.setU64Const(u64Const >> constant.i64Const); break;
  552. case EbtUint64: returnValue.setU64Const(u64Const >> constant.u64Const); break;
  553. default: assert(false && "Default missing");
  554. }
  555. break;
  556. #endif
  557. default: assert(false && "Default missing");
  558. }
  559. return returnValue;
  560. }
  561. TConstUnion operator<<(const TConstUnion& constant) const
  562. {
  563. TConstUnion returnValue;
  564. switch (type) {
  565. #ifndef GLSLANG_WEB
  566. case EbtInt8:
  567. switch (constant.type) {
  568. case EbtInt8: returnValue.setI8Const(i8Const << constant.i8Const); break;
  569. case EbtUint8: returnValue.setI8Const(i8Const << constant.u8Const); break;
  570. case EbtInt16: returnValue.setI8Const(i8Const << constant.i16Const); break;
  571. case EbtUint16: returnValue.setI8Const(i8Const << constant.u16Const); break;
  572. case EbtInt: returnValue.setI8Const(i8Const << constant.iConst); break;
  573. case EbtUint: returnValue.setI8Const(i8Const << constant.uConst); break;
  574. case EbtInt64: returnValue.setI8Const(i8Const << constant.i64Const); break;
  575. case EbtUint64: returnValue.setI8Const(i8Const << constant.u64Const); break;
  576. default: assert(false && "Default missing");
  577. }
  578. break;
  579. case EbtUint8:
  580. switch (constant.type) {
  581. case EbtInt8: returnValue.setU8Const(u8Const << constant.i8Const); break;
  582. case EbtUint8: returnValue.setU8Const(u8Const << constant.u8Const); break;
  583. case EbtInt16: returnValue.setU8Const(u8Const << constant.i16Const); break;
  584. case EbtUint16: returnValue.setU8Const(u8Const << constant.u16Const); break;
  585. case EbtInt: returnValue.setU8Const(u8Const << constant.iConst); break;
  586. case EbtUint: returnValue.setU8Const(u8Const << constant.uConst); break;
  587. case EbtInt64: returnValue.setU8Const(u8Const << constant.i64Const); break;
  588. case EbtUint64: returnValue.setU8Const(u8Const << constant.u64Const); break;
  589. default: assert(false && "Default missing");
  590. }
  591. break;
  592. case EbtInt16:
  593. switch (constant.type) {
  594. case EbtInt8: returnValue.setI16Const(i16Const << constant.i8Const); break;
  595. case EbtUint8: returnValue.setI16Const(i16Const << constant.u8Const); break;
  596. case EbtInt16: returnValue.setI16Const(i16Const << constant.i16Const); break;
  597. case EbtUint16: returnValue.setI16Const(i16Const << constant.u16Const); break;
  598. case EbtInt: returnValue.setI16Const(i16Const << constant.iConst); break;
  599. case EbtUint: returnValue.setI16Const(i16Const << constant.uConst); break;
  600. case EbtInt64: returnValue.setI16Const(i16Const << constant.i64Const); break;
  601. case EbtUint64: returnValue.setI16Const(i16Const << constant.u64Const); break;
  602. default: assert(false && "Default missing");
  603. }
  604. break;
  605. case EbtUint16:
  606. switch (constant.type) {
  607. case EbtInt8: returnValue.setU16Const(u16Const << constant.i8Const); break;
  608. case EbtUint8: returnValue.setU16Const(u16Const << constant.u8Const); break;
  609. case EbtInt16: returnValue.setU16Const(u16Const << constant.i16Const); break;
  610. case EbtUint16: returnValue.setU16Const(u16Const << constant.u16Const); break;
  611. case EbtInt: returnValue.setU16Const(u16Const << constant.iConst); break;
  612. case EbtUint: returnValue.setU16Const(u16Const << constant.uConst); break;
  613. case EbtInt64: returnValue.setU16Const(u16Const << constant.i64Const); break;
  614. case EbtUint64: returnValue.setU16Const(u16Const << constant.u64Const); break;
  615. default: assert(false && "Default missing");
  616. }
  617. break;
  618. case EbtInt64:
  619. switch (constant.type) {
  620. case EbtInt8: returnValue.setI64Const(i64Const << constant.i8Const); break;
  621. case EbtUint8: returnValue.setI64Const(i64Const << constant.u8Const); break;
  622. case EbtInt16: returnValue.setI64Const(i64Const << constant.i16Const); break;
  623. case EbtUint16: returnValue.setI64Const(i64Const << constant.u16Const); break;
  624. case EbtInt: returnValue.setI64Const(i64Const << constant.iConst); break;
  625. case EbtUint: returnValue.setI64Const(i64Const << constant.uConst); break;
  626. case EbtInt64: returnValue.setI64Const(i64Const << constant.i64Const); break;
  627. case EbtUint64: returnValue.setI64Const(i64Const << constant.u64Const); break;
  628. default: assert(false && "Default missing");
  629. }
  630. break;
  631. case EbtUint64:
  632. switch (constant.type) {
  633. case EbtInt8: returnValue.setU64Const(u64Const << constant.i8Const); break;
  634. case EbtUint8: returnValue.setU64Const(u64Const << constant.u8Const); break;
  635. case EbtInt16: returnValue.setU64Const(u64Const << constant.i16Const); break;
  636. case EbtUint16: returnValue.setU64Const(u64Const << constant.u16Const); break;
  637. case EbtInt: returnValue.setU64Const(u64Const << constant.iConst); break;
  638. case EbtUint: returnValue.setU64Const(u64Const << constant.uConst); break;
  639. case EbtInt64: returnValue.setU64Const(u64Const << constant.i64Const); break;
  640. case EbtUint64: returnValue.setU64Const(u64Const << constant.u64Const); break;
  641. default: assert(false && "Default missing");
  642. }
  643. break;
  644. #endif
  645. case EbtInt:
  646. switch (constant.type) {
  647. case EbtInt: returnValue.setIConst(iConst << constant.iConst); break;
  648. case EbtUint: returnValue.setIConst(iConst << constant.uConst); break;
  649. #ifndef GLSLANG_WEB
  650. case EbtInt8: returnValue.setIConst(iConst << constant.i8Const); break;
  651. case EbtUint8: returnValue.setIConst(iConst << constant.u8Const); break;
  652. case EbtInt16: returnValue.setIConst(iConst << constant.i16Const); break;
  653. case EbtUint16: returnValue.setIConst(iConst << constant.u16Const); break;
  654. case EbtInt64: returnValue.setIConst(iConst << constant.i64Const); break;
  655. case EbtUint64: returnValue.setIConst(iConst << constant.u64Const); break;
  656. #endif
  657. default: assert(false && "Default missing");
  658. }
  659. break;
  660. case EbtUint:
  661. switch (constant.type) {
  662. case EbtInt: returnValue.setUConst(uConst << constant.iConst); break;
  663. case EbtUint: returnValue.setUConst(uConst << constant.uConst); break;
  664. #ifndef GLSLANG_WEB
  665. case EbtInt8: returnValue.setUConst(uConst << constant.i8Const); break;
  666. case EbtUint8: returnValue.setUConst(uConst << constant.u8Const); break;
  667. case EbtInt16: returnValue.setUConst(uConst << constant.i16Const); break;
  668. case EbtUint16: returnValue.setUConst(uConst << constant.u16Const); break;
  669. case EbtInt64: returnValue.setUConst(uConst << constant.i64Const); break;
  670. case EbtUint64: returnValue.setUConst(uConst << constant.u64Const); break;
  671. #endif
  672. default: assert(false && "Default missing");
  673. }
  674. break;
  675. default: assert(false && "Default missing");
  676. }
  677. return returnValue;
  678. }
  679. TConstUnion operator&(const TConstUnion& constant) const
  680. {
  681. TConstUnion returnValue;
  682. assert(type == constant.type);
  683. switch (type) {
  684. case EbtInt: returnValue.setIConst(iConst & constant.iConst); break;
  685. case EbtUint: returnValue.setUConst(uConst & constant.uConst); break;
  686. #ifndef GLSLANG_WEB
  687. case EbtInt8: returnValue.setI8Const(i8Const & constant.i8Const); break;
  688. case EbtUint8: returnValue.setU8Const(u8Const & constant.u8Const); break;
  689. case EbtInt16: returnValue.setI16Const(i16Const & constant.i16Const); break;
  690. case EbtUint16: returnValue.setU16Const(u16Const & constant.u16Const); break;
  691. case EbtInt64: returnValue.setI64Const(i64Const & constant.i64Const); break;
  692. case EbtUint64: returnValue.setU64Const(u64Const & constant.u64Const); break;
  693. #endif
  694. default: assert(false && "Default missing");
  695. }
  696. return returnValue;
  697. }
  698. TConstUnion operator|(const TConstUnion& constant) const
  699. {
  700. TConstUnion returnValue;
  701. assert(type == constant.type);
  702. switch (type) {
  703. case EbtInt: returnValue.setIConst(iConst | constant.iConst); break;
  704. case EbtUint: returnValue.setUConst(uConst | constant.uConst); break;
  705. #ifndef GLSLANG_WEB
  706. case EbtInt8: returnValue.setI8Const(i8Const | constant.i8Const); break;
  707. case EbtUint8: returnValue.setU8Const(u8Const | constant.u8Const); break;
  708. case EbtInt16: returnValue.setI16Const(i16Const | constant.i16Const); break;
  709. case EbtUint16: returnValue.setU16Const(u16Const | constant.u16Const); break;
  710. case EbtInt64: returnValue.setI64Const(i64Const | constant.i64Const); break;
  711. case EbtUint64: returnValue.setU64Const(u64Const | constant.u64Const); break;
  712. #endif
  713. default: assert(false && "Default missing");
  714. }
  715. return returnValue;
  716. }
  717. TConstUnion operator^(const TConstUnion& constant) const
  718. {
  719. TConstUnion returnValue;
  720. assert(type == constant.type);
  721. switch (type) {
  722. case EbtInt: returnValue.setIConst(iConst ^ constant.iConst); break;
  723. case EbtUint: returnValue.setUConst(uConst ^ constant.uConst); break;
  724. #ifndef GLSLANG_WEB
  725. case EbtInt8: returnValue.setI8Const(i8Const ^ constant.i8Const); break;
  726. case EbtUint8: returnValue.setU8Const(u8Const ^ constant.u8Const); break;
  727. case EbtInt16: returnValue.setI16Const(i16Const ^ constant.i16Const); break;
  728. case EbtUint16: returnValue.setU16Const(u16Const ^ constant.u16Const); break;
  729. case EbtInt64: returnValue.setI64Const(i64Const ^ constant.i64Const); break;
  730. case EbtUint64: returnValue.setU64Const(u64Const ^ constant.u64Const); break;
  731. #endif
  732. default: assert(false && "Default missing");
  733. }
  734. return returnValue;
  735. }
  736. TConstUnion operator~() const
  737. {
  738. TConstUnion returnValue;
  739. switch (type) {
  740. case EbtInt: returnValue.setIConst(~iConst); break;
  741. case EbtUint: returnValue.setUConst(~uConst); break;
  742. #ifndef GLSLANG_WEB
  743. case EbtInt8: returnValue.setI8Const(~i8Const); break;
  744. case EbtUint8: returnValue.setU8Const(~u8Const); break;
  745. case EbtInt16: returnValue.setI16Const(~i16Const); break;
  746. case EbtUint16: returnValue.setU16Const(~u16Const); break;
  747. case EbtInt64: returnValue.setI64Const(~i64Const); break;
  748. case EbtUint64: returnValue.setU64Const(~u64Const); break;
  749. #endif
  750. default: assert(false && "Default missing");
  751. }
  752. return returnValue;
  753. }
  754. TConstUnion operator&&(const TConstUnion& constant) const
  755. {
  756. TConstUnion returnValue;
  757. assert(type == constant.type);
  758. switch (type) {
  759. case EbtBool: returnValue.setBConst(bConst && constant.bConst); break;
  760. default: assert(false && "Default missing");
  761. }
  762. return returnValue;
  763. }
  764. TConstUnion operator||(const TConstUnion& constant) const
  765. {
  766. TConstUnion returnValue;
  767. assert(type == constant.type);
  768. switch (type) {
  769. case EbtBool: returnValue.setBConst(bConst || constant.bConst); break;
  770. default: assert(false && "Default missing");
  771. }
  772. return returnValue;
  773. }
  774. TBasicType getType() const { return type; }
  775. private:
  776. union {
  777. signed char i8Const; // used for i8vec, scalar int8s
  778. unsigned char u8Const; // used for u8vec, scalar uint8s
  779. signed short i16Const; // used for i16vec, scalar int16s
  780. unsigned short u16Const; // used for u16vec, scalar uint16s
  781. int iConst; // used for ivec, scalar ints
  782. unsigned int uConst; // used for uvec, scalar uints
  783. long long i64Const; // used for i64vec, scalar int64s
  784. unsigned long long u64Const; // used for u64vec, scalar uint64s
  785. bool bConst; // used for bvec, scalar bools
  786. double dConst; // used for vec, dvec, mat, dmat, scalar floats and doubles
  787. const TString* sConst; // string constant
  788. };
  789. TBasicType type;
  790. };
  791. // Encapsulate having a pointer to an array of TConstUnion,
  792. // which only needs to be allocated if its size is going to be
  793. // bigger than 0.
  794. //
  795. // One convenience is being able to use [] to go inside the array, instead
  796. // of C++ assuming it as an array of pointers to vectors.
  797. //
  798. // General usage is that the size is known up front, and it is
  799. // created once with the proper size.
  800. //
  801. class TConstUnionArray {
  802. public:
  803. POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())
  804. TConstUnionArray() : unionArray(nullptr) { }
  805. virtual ~TConstUnionArray() { }
  806. explicit TConstUnionArray(int size)
  807. {
  808. if (size == 0)
  809. unionArray = nullptr;
  810. else
  811. unionArray = new TConstUnionVector(size);
  812. }
  813. TConstUnionArray(const TConstUnionArray& a) = default;
  814. TConstUnionArray(const TConstUnionArray& a, int start, int size)
  815. {
  816. unionArray = new TConstUnionVector(size);
  817. for (int i = 0; i < size; ++i)
  818. (*unionArray)[i] = a[start + i];
  819. }
  820. // Use this constructor for a smear operation
  821. TConstUnionArray(int size, const TConstUnion& val)
  822. {
  823. unionArray = new TConstUnionVector(size, val);
  824. }
  825. int size() const { return unionArray ? (int)unionArray->size() : 0; }
  826. TConstUnion& operator[](size_t index) { return (*unionArray)[index]; }
  827. const TConstUnion& operator[](size_t index) const { return (*unionArray)[index]; }
  828. bool operator==(const TConstUnionArray& rhs) const
  829. {
  830. // this includes the case that both are unallocated
  831. if (unionArray == rhs.unionArray)
  832. return true;
  833. if (! unionArray || ! rhs.unionArray)
  834. return false;
  835. return *unionArray == *rhs.unionArray;
  836. }
  837. bool operator!=(const TConstUnionArray& rhs) const { return ! operator==(rhs); }
  838. double dot(const TConstUnionArray& rhs)
  839. {
  840. assert(rhs.unionArray->size() == unionArray->size());
  841. double sum = 0.0;
  842. for (size_t comp = 0; comp < unionArray->size(); ++comp)
  843. sum += (*this)[comp].getDConst() * rhs[comp].getDConst();
  844. return sum;
  845. }
  846. bool empty() const { return unionArray == nullptr; }
  847. protected:
  848. typedef TVector<TConstUnion> TConstUnionVector;
  849. TConstUnionVector* unionArray;
  850. };
  851. } // end namespace glslang
  852. #endif // _CONSTANT_UNION_INCLUDED_