PageRenderTime 47ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/hphp/runtime/base/array-data-defs.h

https://github.com/tstarling/hiphop-php
C Header | 357 lines | 260 code | 79 blank | 18 comment | 1 complexity | d96052ef21510cc851551a4eda55f972 MD5 | raw file
  1. /*
  2. +----------------------------------------------------------------------+
  3. | HipHop for PHP |
  4. +----------------------------------------------------------------------+
  5. | Copyright (c) 2010-2014 Facebook, Inc. (http://www.facebook.com) |
  6. +----------------------------------------------------------------------+
  7. | This source file is subject to version 3.01 of the PHP license, |
  8. | that is bundled with this package in the file LICENSE, and is |
  9. | available through the world-wide-web at the following url: |
  10. | http://www.php.net/license/3_01.txt |
  11. | If you did not receive a copy of the PHP license and are unable to |
  12. | obtain it through the world-wide-web, please send a note to |
  13. | license@php.net so we can mail you a copy immediately. |
  14. +----------------------------------------------------------------------+
  15. */
  16. #ifndef incl_HPHP_ARRAY_DEFS_H_
  17. #define incl_HPHP_ARRAY_DEFS_H_
  18. #include "hphp/runtime/base/array-data.h"
  19. #include <algorithm>
  20. #include "hphp/runtime/base/complex-types.h"
  21. namespace HPHP {
  22. ///////////////////////////////////////////////////////////////////////////////
  23. namespace {
  24. inline bool isIntKey(const Cell* cell) {
  25. return IS_INT_KEY_TYPE(cell->m_type);
  26. }
  27. inline int64_t getIntKey(const Cell* cell) {
  28. assert(cell->m_type == KindOfInt64);
  29. return cell->m_data.num;
  30. }
  31. inline StringData* getStringKey(const Cell* cell) {
  32. assert(IS_STRING_TYPE(cell->m_type));
  33. return cell->m_data.pstr;
  34. }
  35. }
  36. inline bool ArrayData::exists(const String& k) const {
  37. assert(IsValidKey(k));
  38. return exists(k.get());
  39. }
  40. inline bool ArrayData::exists(const Variant& k) const {
  41. assert(IsValidKey(k));
  42. auto const cell = k.asCell();
  43. return isIntKey(cell) ? exists(getIntKey(cell))
  44. : exists(getStringKey(cell));
  45. }
  46. inline const Variant& ArrayData::get(const String& k, bool error) const {
  47. assert(IsValidKey(k));
  48. return get(k.get(), error);
  49. }
  50. inline const Variant& ArrayData::get(int64_t k, bool error) const {
  51. auto tv = nvGet(k);
  52. return tv ? tvAsCVarRef(tv) : getNotFound(k, error);
  53. }
  54. inline const Variant& ArrayData::get(const StringData* k, bool error) const {
  55. auto tv = nvGet(k);
  56. return tv ? tvAsCVarRef(tv) : getNotFound(k, error);
  57. }
  58. inline ArrayData* ArrayData::lval(const String& k, Variant *&ret, bool copy) {
  59. assert(IsValidKey(k));
  60. return lval(k.get(), ret, copy);
  61. }
  62. inline ArrayData* ArrayData::lval(const Variant& k, Variant *&ret, bool copy) {
  63. assert(IsValidKey(k));
  64. auto const cell = k.asCell();
  65. return isIntKey(cell) ? lval(getIntKey(cell), ret, copy)
  66. : lval(getStringKey(cell), ret, copy);
  67. }
  68. inline ArrayData* ArrayData::set(const String& k, const Variant& v, bool copy) {
  69. assert(IsValidKey(k));
  70. return set(k.get(), v, copy);
  71. }
  72. inline ArrayData* ArrayData::set(const Variant& k, const Variant& v, bool copy) {
  73. assert(IsValidKey(k));
  74. auto const cell = k.asCell();
  75. return isIntKey(cell) ? set(getIntKey(cell), v, copy)
  76. : set(getStringKey(cell), v, copy);
  77. }
  78. inline ArrayData* ArrayData::setRef(const String& k, const Variant& v, bool copy) {
  79. assert(IsValidKey(k));
  80. return setRef(k.get(), v, copy);
  81. }
  82. inline ArrayData* ArrayData::setRef(const Variant& k, const Variant& v, bool copy) {
  83. assert(IsValidKey(k));
  84. auto const cell = k.asCell();
  85. return isIntKey(cell) ? setRef(getIntKey(cell), v, copy)
  86. : setRef(getStringKey(cell), v, copy);
  87. }
  88. inline ArrayData* ArrayData::add(const String& k, const Variant& v, bool copy) {
  89. assert(IsValidKey(k));
  90. return add(k.get(), v, copy);
  91. }
  92. inline ArrayData* ArrayData::add(const Variant& k, const Variant& v, bool copy) {
  93. assert(IsValidKey(k));
  94. auto const cell = k.asCell();
  95. return isIntKey(cell) ? add(getIntKey(cell), v, copy)
  96. : add(getStringKey(cell), v, copy);
  97. }
  98. inline ArrayData* ArrayData::remove(const String& k, bool copy) {
  99. assert(IsValidKey(k));
  100. return remove(k.get(), copy);
  101. }
  102. inline ArrayData* ArrayData::remove(const Variant& k, bool copy) {
  103. assert(IsValidKey(k));
  104. auto const cell = k.asCell();
  105. return isIntKey(cell) ? remove(getIntKey(cell), copy)
  106. : remove(getStringKey(cell), copy);
  107. }
  108. inline Variant ArrayData::getValue(ssize_t pos) const {
  109. return getValueRef(pos);
  110. }
  111. inline TypedValue* ArrayData::nvGetValueRef(ssize_t pos) {
  112. return const_cast<TypedValue*>(getValueRef(pos).asTypedValue());
  113. }
  114. inline Variant ArrayData::getKey(ssize_t pos) const {
  115. TypedValue tv;
  116. nvGetKey(&tv, pos);
  117. return std::move(tvAsVariant(&tv));
  118. }
  119. ///////////////////////////////////////////////////////////////////////////////
  120. inline void ArrayData::release() {
  121. return g_array_funcs.release[m_kind](this);
  122. }
  123. inline ArrayData* ArrayData::append(const Variant& v, bool copy) {
  124. return g_array_funcs.append[m_kind](this, v, copy);
  125. }
  126. inline ArrayData* ArrayData::appendRef(const Variant& v, bool copy) {
  127. return g_array_funcs.appendRef[m_kind](this, v, copy);
  128. }
  129. inline ArrayData* ArrayData::appendWithRef(const Variant& v, bool copy) {
  130. return g_array_funcs.appendWithRef[m_kind](this, v, copy);
  131. }
  132. inline TypedValue* ArrayData::nvGet(int64_t ikey) const {
  133. return g_array_funcs.nvGetInt[m_kind](this, ikey);
  134. }
  135. inline TypedValue* ArrayData::nvGet(const StringData* skey) const {
  136. return g_array_funcs.nvGetStr[m_kind](this, skey);
  137. }
  138. inline void ArrayData::nvGetKey(TypedValue* out, ssize_t pos) const {
  139. g_array_funcs.nvGetKey[m_kind](this, out, pos);
  140. }
  141. inline ArrayData* ArrayData::set(int64_t k, const Variant& v, bool copy) {
  142. return g_array_funcs.setInt[m_kind](this, k, v, copy);
  143. }
  144. inline ArrayData* ArrayData::set(StringData* k, const Variant& v, bool copy) {
  145. return g_array_funcs.setStr[m_kind](this, k, v, copy);
  146. }
  147. inline ArrayData* ArrayData::zSet(int64_t k, RefData* v) {
  148. return g_array_funcs.zSetInt[m_kind](this, k, v);
  149. }
  150. inline ArrayData* ArrayData::zSet(StringData* k, RefData* v) {
  151. return g_array_funcs.zSetStr[m_kind](this, k, v);
  152. }
  153. inline ArrayData* ArrayData::zAppend(RefData* v) {
  154. return g_array_funcs.zAppend[m_kind](this, v);
  155. }
  156. inline size_t ArrayData::vsize() const {
  157. return g_array_funcs.vsize[m_kind](this);
  158. }
  159. inline const Variant& ArrayData::getValueRef(ssize_t pos) const {
  160. return g_array_funcs.getValueRef[m_kind](this, pos);
  161. }
  162. inline bool ArrayData::noCopyOnWrite() const {
  163. return g_array_funcs.noCopyOnWrite[m_kind];
  164. }
  165. inline bool ArrayData::isVectorData() const {
  166. return g_array_funcs.isVectorData[m_kind](this);
  167. }
  168. inline bool ArrayData::exists(int64_t k) const {
  169. return g_array_funcs.existsInt[m_kind](this, k);
  170. }
  171. inline bool ArrayData::exists(const StringData* k) const {
  172. return g_array_funcs.existsStr[m_kind](this, k);
  173. }
  174. inline ArrayData* ArrayData::lval(int64_t k, Variant*& ret, bool copy) {
  175. return g_array_funcs.lvalInt[m_kind](this, k, ret, copy);
  176. }
  177. inline ArrayData* ArrayData::lval(StringData* k, Variant*& ret, bool copy) {
  178. return g_array_funcs.lvalStr[m_kind](this, k, ret, copy);
  179. }
  180. inline ArrayData* ArrayData::lvalNew(Variant*& ret, bool copy) {
  181. return g_array_funcs.lvalNew[m_kind](this, ret, copy);
  182. }
  183. inline ArrayData* ArrayData::setRef(int64_t k, const Variant& v, bool copy) {
  184. return g_array_funcs.setRefInt[m_kind](this, k, v, copy);
  185. }
  186. inline ArrayData* ArrayData::setRef(StringData* k, const Variant& v, bool copy) {
  187. return g_array_funcs.setRefStr[m_kind](this, k, v, copy);
  188. }
  189. inline ArrayData* ArrayData::add(int64_t k, const Variant& v, bool copy) {
  190. return g_array_funcs.addInt[m_kind](this, k, v, copy);
  191. }
  192. inline ArrayData* ArrayData::add(StringData* k, const Variant& v, bool copy) {
  193. return g_array_funcs.addStr[m_kind](this, k, v, copy);
  194. }
  195. inline ArrayData* ArrayData::remove(int64_t k, bool copy) {
  196. return g_array_funcs.removeInt[m_kind](this, k, copy);
  197. }
  198. inline ArrayData* ArrayData::remove(const StringData* k, bool copy) {
  199. return g_array_funcs.removeStr[m_kind](this, k, copy);
  200. }
  201. inline ssize_t ArrayData::iter_begin() const {
  202. return g_array_funcs.iterBegin[m_kind](this);
  203. }
  204. inline ssize_t ArrayData::iter_end() const {
  205. return g_array_funcs.iterEnd[m_kind](this);
  206. }
  207. inline ssize_t ArrayData::iter_advance(ssize_t pos) const {
  208. return g_array_funcs.iterAdvance[m_kind](this, pos);
  209. }
  210. inline ssize_t ArrayData::iter_rewind(ssize_t pos) const {
  211. return g_array_funcs.iterRewind[m_kind](this, pos);
  212. }
  213. inline bool ArrayData::validMArrayIter(const MArrayIter& fp) const {
  214. return g_array_funcs.validMArrayIter[m_kind](this, fp);
  215. }
  216. inline bool ArrayData::advanceMArrayIter(MArrayIter& fp) {
  217. return g_array_funcs.advanceMArrayIter[m_kind](this, fp);
  218. }
  219. inline ArrayData* ArrayData::escalateForSort() {
  220. return g_array_funcs.escalateForSort[m_kind](this);
  221. }
  222. inline void ArrayData::ksort(int sort_flags, bool ascending) {
  223. return g_array_funcs.ksort[m_kind](this, sort_flags, ascending);
  224. }
  225. inline void ArrayData::sort(int sort_flags, bool ascending) {
  226. return g_array_funcs.sort[m_kind](this, sort_flags, ascending);
  227. }
  228. inline void ArrayData::asort(int sort_flags, bool ascending) {
  229. return g_array_funcs.asort[m_kind](this, sort_flags, ascending);
  230. }
  231. inline bool ArrayData::uksort(const Variant& compare) {
  232. return g_array_funcs.uksort[m_kind](this, compare);
  233. }
  234. inline bool ArrayData::usort(const Variant& compare) {
  235. return g_array_funcs.usort[m_kind](this, compare);
  236. }
  237. inline bool ArrayData::uasort(const Variant& compare) {
  238. return g_array_funcs.uasort[m_kind](this, compare);
  239. }
  240. inline ArrayData* ArrayData::copy() const {
  241. return g_array_funcs.copy[m_kind](this);
  242. }
  243. inline ArrayData* ArrayData::copyWithStrongIterators() const {
  244. return g_array_funcs.copyWithStrongIterators[m_kind](this);
  245. }
  246. inline ArrayData* ArrayData::nonSmartCopy() const {
  247. return g_array_funcs.nonSmartCopy[m_kind](this);
  248. }
  249. inline ArrayData* ArrayData::pop(Variant& value) {
  250. return g_array_funcs.pop[m_kind](this, value);
  251. }
  252. inline ArrayData* ArrayData::dequeue(Variant& value) {
  253. return g_array_funcs.dequeue[m_kind](this, value);
  254. }
  255. inline ArrayData* ArrayData::prepend(const Variant& value, bool copy) {
  256. return g_array_funcs.prepend[m_kind](this, value, copy);
  257. }
  258. inline void ArrayData::renumber() {
  259. return g_array_funcs.renumber[m_kind](this);
  260. }
  261. inline void ArrayData::onSetEvalScalar() {
  262. return g_array_funcs.onSetEvalScalar[m_kind](this);
  263. }
  264. inline ArrayData* ArrayData::escalate() const {
  265. return g_array_funcs.escalate[m_kind](this);
  266. }
  267. inline ArrayData* ArrayData::plusEq(const ArrayData* elms) {
  268. return g_array_funcs.plusEq[m_kind](this, elms);
  269. }
  270. inline ArrayData* ArrayData::merge(const ArrayData* elms) {
  271. return g_array_funcs.merge[m_kind](this, elms);
  272. }
  273. inline APCHandle* ArrayData::getAPCHandle() {
  274. return g_array_funcs.getAPCHandle[m_kind](this);
  275. }
  276. ///////////////////////////////////////////////////////////////////////////////
  277. }
  278. #endif // incl_HPHP_ARRAY_DEFS_H_