Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

934 lines
29 KiB

  1. // valarray standard header
  2. #ifndef _VALARRAY_
  3. #define _VALARRAY_
  4. #include <cstring>
  5. #include <xstddef>
  6. #ifdef _MSC_VER
  7. #pragma pack(push,8)
  8. #endif /* _MSC_VER */
  9. _STD_BEGIN
  10. class gslice;
  11. class slice;
  12. template<class _Ty>
  13. class gslice_array;
  14. template<class _Ty>
  15. class indirect_array;
  16. template<class _Ty>
  17. class mask_array;
  18. template<class _Ty>
  19. class slice_array;
  20. template<class _Ty>
  21. class valarray;
  22. typedef valarray<_Bool> _Boolarray;
  23. typedef valarray<size_t> _Sizarray;
  24. // TEMPLATE CLASS valarray
  25. #define _VALOP(TYPE, LENGTH, RHS) \
  26. valarray<TYPE> _Ans(LENGTH); \
  27. for (size_t _I = 0; _I < _Ans.size(); ++_I) \
  28. _Ans[_I] = RHS; \
  29. return (_Ans)
  30. #define _VALGOP(RHS) \
  31. for (size_t _I = 0; _I < size(); ++_I) \
  32. _Ptr[_I] RHS; \
  33. return (*this)
  34. #define _VALGOP2(RHS) \
  35. for (size_t _I = 0; _I < _L.size(); ++_I) \
  36. _L[_I] RHS; \
  37. return (_L)
  38. template<class _Ty>
  39. class valarray {
  40. public:
  41. typedef _Ty value_type;
  42. explicit valarray(size_t _N = 0)
  43. {_Tidy(), _Res = _N, _Grow(_N); }
  44. valarray(const _Ty& _X, size_t _N)
  45. {_Tidy(), _Grow(_N, &_X); }
  46. valarray(const _Ty *_S, size_t _N)
  47. {_Tidy(), _Grow(_N, _S, 1); }
  48. valarray(const valarray<_Ty>& _X)
  49. {_Tidy(), _Grow(_X.size(), _X._Ptr, 1); }
  50. valarray(const slice_array<_Ty>& _Sl)
  51. {_Tidy();
  52. *this = _Sl; }
  53. valarray(const gslice_array<_Ty>& _Gs)
  54. {_Tidy();
  55. *this = _Gs; }
  56. valarray(const mask_array<_Ty>& _Ma)
  57. {_Tidy();
  58. *this = _Ma; }
  59. valarray(const indirect_array<_Ty>& _Ia)
  60. {_Tidy();
  61. *this = _Ia; }
  62. ~valarray()
  63. {_Tidy(true); }
  64. valarray<_Ty>& operator=(const valarray<_Ty>& _R)
  65. {if (this == &_R)
  66. return (*this);
  67. _Grow(_R.size(), 0, 0, true);
  68. _VALGOP(= _R[_I]); }
  69. valarray<_Ty>& operator=(const _Ty& _R)
  70. {_VALGOP(= _R); }
  71. void resize(size_t _N, const _Ty& _C = _Ty())
  72. {_Grow(_N, &_C, 0, true); }
  73. valarray<_Ty>& operator=(const slice_array<_Ty>& _Sl);
  74. valarray<_Ty>& operator=(const gslice_array<_Ty>& _Gs);
  75. valarray<_Ty>& operator=(const mask_array<_Ty>& _Ma);
  76. valarray<_Ty>& operator=(const indirect_array<_Ty>& _Ia);
  77. size_t size() const
  78. {return (_Len); }
  79. _Ty operator[](size_t _I) const
  80. {return (_Ptr[_I]); }
  81. _Ty& operator[](size_t _I)
  82. {return (_Ptr[_I]); }
  83. valarray<_Ty> operator[](slice _Sl) const;
  84. slice_array<_Ty> operator[](slice _Sl);
  85. valarray<_Ty> operator[](const gslice& _Gs) const;
  86. gslice_array<_Ty> operator[](const gslice& _Gs);
  87. valarray<_Ty> operator[](
  88. const _Boolarray& _Ba) const;
  89. mask_array<_Ty> operator[](
  90. const _Boolarray& _Ba);
  91. valarray<_Ty> operator[](const _Sizarray& _Ia) const;
  92. indirect_array<_Ty> operator[](const _Sizarray& _Ia);
  93. _Ty sum() const
  94. {_Ty _Sum = _Ptr[0];
  95. for (size_t _I = 0; ++_I < size(); )
  96. _Sum += _Ptr[_I];
  97. return (_Sum); }
  98. _Ty min() const
  99. {_Ty _Min = _Ptr[0];
  100. for (size_t _I = 0; ++_I < size(); )
  101. if (_Ptr[_I] < _Min)
  102. _Min = _Ptr[_I];
  103. return (_Min); }
  104. _Ty max() const
  105. {_Ty _Max = _Ptr[0];
  106. for (size_t _I = 0; ++_I < size(); )
  107. if (_Max < _Ptr[_I])
  108. _Max = _Ptr[_I];
  109. return (_Max); }
  110. valarray<_Ty> shift(int _N) const
  111. {static _Ty _Def;
  112. _VALOP(_Ty, size(),
  113. 0 < _N && size() - _I <= _N
  114. || _N < 0 && _I < -_N
  115. ? _Def : _Ptr[_I + _N]); }
  116. valarray<_Ty> cshift(int _N) const
  117. {if (size() == 0)
  118. ;
  119. else if (_N < 0)
  120. {if ((_N += size()) < 0)
  121. _N = size() - (-_N) % size(); }
  122. else if (size() <= _N)
  123. _N %= size();
  124. _VALOP(_Ty, size(),
  125. size() - _I <= _N
  126. ? _Ptr[_I - size() + _N] : _Ptr[_I + _N]); }
  127. valarray<_Ty> apply(_Ty _F(_Ty)) const
  128. {_VALOP(_Ty, size(), _F(_Ptr[_I])); }
  129. valarray<_Ty> apply(_Ty _F(const _Ty&)) const
  130. {_VALOP(_Ty, size(), _F(_Ptr[_I])); }
  131. void free()
  132. {_Tidy(true); }
  133. private:
  134. void _Grow(size_t _N, const _Ty *_S = 0, size_t _D = 0,
  135. bool _Trim = 0)
  136. {size_t _Os = _Ptr == 0 ? 0 : _Res;
  137. if (_N == 0)
  138. {if (_Trim)
  139. _Tidy(true); }
  140. else if (_N == _Os || _N < _Os && !_Trim)
  141. ;
  142. else
  143. {size_t _I, _M = _Ptr == 0 && _N < _Res ? _Res : _N;
  144. _Ty *_Np = new _Ty[_M];
  145. if (_Np == 0)
  146. _Nomemory();
  147. size_t _Nm = _N < _Len ? _N : _Len;
  148. for (_I = 0; _I < _Nm; ++_I)
  149. _Np[_I] = _Ptr[_I];
  150. if (_S != 0)
  151. for (; _I < _M; ++_I, _S += _D)
  152. _Np[_I] = *_S;
  153. _Tidy(true), _Ptr = _Np, _Res = _M; }
  154. _Len = _N; }
  155. void _Tidy(bool _Constructed = 0)
  156. {if (_Constructed && _Ptr != 0)
  157. delete[] _Ptr;
  158. _Len = 0, _Ptr = 0, _Res = 0; }
  159. _Ty *_Ptr;
  160. size_t _Len, _Res;
  161. };
  162. // valarray MEMBER TEMPLATE OPERATORS
  163. template<class _Ty> inline
  164. valarray<_Ty> operator+(const valarray<_Ty>& _L)
  165. {_VALOP(_Ty, _L.size(), +_L[_I]); }
  166. template<class _Ty> inline
  167. valarray<_Ty> operator-(const valarray<_Ty>& _L)
  168. {_VALOP(_Ty, _L.size(), -_L[_I]); }
  169. template<class _Ty> inline
  170. valarray<_Ty> operator~(const valarray<_Ty>& _L)
  171. {_VALOP(_Ty, _L.size(), ~_L[_I]); }
  172. template<class _Ty> inline
  173. _Boolarray operator!(const valarray<_Ty>& _L)
  174. {_VALOP(_Bool, _L.size(), !_L[_I]); }
  175. template<class _Ty> inline
  176. valarray<_Ty>& operator*=(valarray<_Ty>& _L, const _Ty& _R)
  177. {_VALGOP2(*= _R); }
  178. template<class _Ty> inline
  179. valarray<_Ty>& operator/=(valarray<_Ty>& _L, const _Ty& _R)
  180. {_VALGOP2(/= _R); }
  181. template<class _Ty> inline
  182. valarray<_Ty>& operator%=(valarray<_Ty>& _L, const _Ty& _R)
  183. {_VALGOP2(%= _R); }
  184. template<class _Ty> inline
  185. valarray<_Ty>& operator+=(valarray<_Ty>& _L, const _Ty& _R)
  186. {_VALGOP2(+= _R); }
  187. template<class _Ty> inline
  188. valarray<_Ty>& operator-=(valarray<_Ty>& _L, const _Ty& _R)
  189. {_VALGOP2(-= _R); }
  190. template<class _Ty> inline
  191. valarray<_Ty>& operator^=(valarray<_Ty>& _L, const _Ty& _R)
  192. {_VALGOP2(^= _R); }
  193. template<class _Ty> inline
  194. valarray<_Ty>& operator&=(valarray<_Ty>& _L, const _Ty& _R)
  195. {_VALGOP2(&= _R); }
  196. template<class _Ty> inline
  197. valarray<_Ty>& operator|=(valarray<_Ty>& _L, const _Ty& _R)
  198. {_VALGOP2(|= _R); }
  199. template<class _Ty> inline
  200. valarray<_Ty>& operator<<=(valarray<_Ty>& _L, const _Ty& _R)
  201. {_VALGOP2(<<= _R); }
  202. template<class _Ty> inline
  203. valarray<_Ty>& operator>>=(valarray<_Ty>& _L, const _Ty& _R)
  204. {_VALGOP2(>>= _R); }
  205. template<class _Ty> inline
  206. valarray<_Ty>& operator*=(valarray<_Ty>& _L,
  207. const valarray<_Ty>& _R)
  208. {_VALGOP2(*= _R[_I]); }
  209. template<class _Ty> inline
  210. valarray<_Ty>& operator/=(valarray<_Ty>& _L,
  211. const valarray<_Ty>& _R)
  212. {_VALGOP2(/= _R[_I]); }
  213. template<class _Ty> inline
  214. valarray<_Ty>& operator%=(valarray<_Ty>& _L,
  215. const valarray<_Ty>& _R)
  216. {_VALGOP2(%= _R[_I]); }
  217. template<class _Ty> inline
  218. valarray<_Ty>& operator+=(valarray<_Ty>& _L,
  219. const valarray<_Ty>& _R)
  220. {_VALGOP2(+= _R[_I]); }
  221. template<class _Ty> inline
  222. valarray<_Ty>& operator-=(valarray<_Ty>& _L,
  223. const valarray<_Ty>& _R)
  224. {_VALGOP2(-= _R[_I]); }
  225. template<class _Ty> inline
  226. valarray<_Ty>& operator^=(valarray<_Ty>& _L,
  227. const valarray<_Ty>& _R)
  228. {_VALGOP2(^= _R[_I]); }
  229. template<class _Ty> inline
  230. valarray<_Ty>& operator|=(valarray<_Ty>& _L,
  231. const valarray<_Ty>& _R)
  232. {_VALGOP2(|= _R[_I]); }
  233. template<class _Ty> inline
  234. valarray<_Ty>& operator&=(valarray<_Ty>& _L,
  235. const valarray<_Ty>& _R)
  236. {_VALGOP2(&= _R[_I]); }
  237. template<class _Ty> inline
  238. valarray<_Ty>& operator<<=(valarray<_Ty>& _L,
  239. const valarray<_Ty>& _R)
  240. {_VALGOP2(<<= _R[_I]); }
  241. template<class _Ty> inline
  242. valarray<_Ty>& operator>>=(valarray<_Ty>& _L,
  243. const valarray<_Ty>& _R)
  244. {_VALGOP2(>>= _R[_I]); }
  245. // valarray TEMPLATE FUNCTIONS
  246. template<class _Ty> inline
  247. valarray<_Ty> operator*(const valarray<_Ty>& _L,
  248. const _Ty& _R)
  249. {_VALOP(_Ty, _L.size(), _L[_I] * _R); }
  250. template<class _Ty> inline
  251. valarray<_Ty> operator*(const _Ty& _L,
  252. const valarray<_Ty>& _R)
  253. {_VALOP(_Ty, _R.size(), _L * _R[_I]); }
  254. template<class _Ty> inline
  255. valarray<_Ty> operator/(const valarray<_Ty>& _L,
  256. const _Ty& _R)
  257. {_VALOP(_Ty, _L.size(), _L[_I] / _R); }
  258. template<class _Ty> inline
  259. valarray<_Ty> operator/(const _Ty& _L,
  260. const valarray<_Ty>& _R)
  261. {_VALOP(_Ty, _R.size(), _L / _R[_I]); }
  262. template<class _Ty> inline
  263. valarray<_Ty> operator%(const valarray<_Ty>& _L,
  264. const _Ty& _R)
  265. {_VALOP(_Ty, _L.size(), _L[_I] % _R); }
  266. template<class _Ty> inline
  267. valarray<_Ty> operator%(const _Ty& _L,
  268. const valarray<_Ty>& _R)
  269. {_VALOP(_Ty, _R.size(), _L % _R[_I]); }
  270. template<class _Ty> inline
  271. valarray<_Ty> operator+(const valarray<_Ty>& _L,
  272. const _Ty& _R)
  273. {_VALOP(_Ty, _L.size(), _L[_I] + _R); }
  274. template<class _Ty> inline
  275. valarray<_Ty> operator+(const _Ty& _L,
  276. const valarray<_Ty>& _R)
  277. {_VALOP(_Ty, _R.size(), _L + _R[_I]); }
  278. template<class _Ty> inline
  279. valarray<_Ty> operator-(const valarray<_Ty>& _L,
  280. const _Ty& _R)
  281. {_VALOP(_Ty, _L.size(), _L[_I] - _R); }
  282. template<class _Ty> inline
  283. valarray<_Ty> operator-(const _Ty& _L,
  284. const valarray<_Ty>& _R)
  285. {_VALOP(_Ty, _R.size(), _L - _R[_I]); }
  286. template<class _Ty> inline
  287. valarray<_Ty> operator^(const valarray<_Ty>& _L,
  288. const _Ty& _R)
  289. {_VALOP(_Ty, _L.size(), _L[_I] ^ _R); }
  290. template<class _Ty> inline
  291. valarray<_Ty> operator^(const _Ty& _L,
  292. const valarray<_Ty>& _R)
  293. {_VALOP(_Ty, _R.size(), _L ^ _R[_I]); }
  294. template<class _Ty> inline
  295. valarray<_Ty> operator&(const valarray<_Ty>& _L,
  296. const _Ty& _R)
  297. {_VALOP(_Ty, _L.size(), _L[_I] & _R); }
  298. template<class _Ty> inline
  299. valarray<_Ty> operator&(const _Ty& _L,
  300. const valarray<_Ty>& _R)
  301. {_VALOP(_Ty, _R.size(), _L & _R[_I]); }
  302. template<class _Ty> inline
  303. valarray<_Ty> operator|(const valarray<_Ty>& _L,
  304. const _Ty& _R)
  305. {_VALOP(_Ty, _L.size(), _L[_I] | _R); }
  306. template<class _Ty> inline
  307. valarray<_Ty> operator|(const _Ty& _L,
  308. const valarray<_Ty>& _R)
  309. {_VALOP(_Ty, _R.size(), _L | _R[_I]); }
  310. template<class _Ty> inline
  311. valarray<_Ty> operator<<(const valarray<_Ty>& _L,
  312. const _Ty& _R)
  313. {_VALOP(_Ty, _L.size(), _L[_I] << _R); }
  314. template<class _Ty> inline
  315. valarray<_Ty> operator<<(const _Ty& _L,
  316. const valarray<_Ty>& _R)
  317. {_VALOP(_Ty, _R.size(), _L << _R[_I]); }
  318. template<class _Ty> inline
  319. valarray<_Ty> operator>>(const valarray<_Ty>& _L,
  320. const _Ty& _R)
  321. {_VALOP(_Ty, _L.size(), _L[_I] >> _R); }
  322. template<class _Ty> inline
  323. valarray<_Ty> operator>>(const _Ty& _L,
  324. const valarray<_Ty>& _R)
  325. {_VALOP(_Ty, _R.size(), _L >> _R[_I]); }
  326. template<class _Ty> inline
  327. _Boolarray operator&&(const valarray<_Ty>& _L,
  328. const _Ty& _R)
  329. {_VALOP(_Bool, _L.size(), _L[_I] && _R); }
  330. template<class _Ty> inline
  331. _Boolarray operator&&(const _Ty& _L,
  332. const valarray<_Ty>& _R)
  333. {_VALOP(_Bool, _R.size(), _L && _R[_I]); }
  334. template<class _Ty> inline
  335. _Boolarray operator||(const valarray<_Ty>& _L,
  336. const _Ty& _R)
  337. {_VALOP(_Bool, _L.size(), _L[_I] || _R); }
  338. template<class _Ty> inline
  339. _Boolarray operator||(const _Ty& _L,
  340. const valarray<_Ty>& _R)
  341. {_VALOP(_Bool, _R.size(), _L || _R[_I]); }
  342. template<class _Ty> inline
  343. valarray<_Ty> operator*(const valarray<_Ty>& _L,
  344. const valarray<_Ty>& _R)
  345. {_VALOP(_Ty, _L.size(), _L[_I] * _R[_I]); }
  346. template<class _Ty> inline
  347. valarray<_Ty> operator/(const valarray<_Ty>& _L,
  348. const valarray<_Ty>& _R)
  349. {_VALOP(_Ty, _L.size(), _L[_I] / _R[_I]); }
  350. template<class _Ty> inline
  351. valarray<_Ty> operator%(const valarray<_Ty>& _L,
  352. const valarray<_Ty>& _R)
  353. {_VALOP(_Ty, _L.size(), _L[_I] % _R[_I]); }
  354. template<class _Ty> inline
  355. valarray<_Ty> operator+(const valarray<_Ty>& _L,
  356. const valarray<_Ty>& _R)
  357. {_VALOP(_Ty, _L.size(), _L[_I] + _R[_I]); }
  358. template<class _Ty> inline
  359. valarray<_Ty> operator-(const valarray<_Ty>& _L,
  360. const valarray<_Ty>& _R)
  361. {_VALOP(_Ty, _L.size(), _L[_I] - _R[_I]); }
  362. template<class _Ty> inline
  363. valarray<_Ty> operator^(const valarray<_Ty>& _L,
  364. const valarray<_Ty>& _R)
  365. {_VALOP(_Ty, _L.size(), _L[_I] ^ _R[_I]); }
  366. template<class _Ty> inline
  367. valarray<_Ty> operator&(const valarray<_Ty>& _L,
  368. const valarray<_Ty>& _R)
  369. {_VALOP(_Ty, _L.size(), _L[_I] & _R[_I]); }
  370. template<class _Ty> inline
  371. valarray<_Ty> operator|(const valarray<_Ty>& _L,
  372. const valarray<_Ty>& _R)
  373. {_VALOP(_Ty, _L.size(), _L[_I] | _R[_I]); }
  374. template<class _Ty> inline
  375. valarray<_Ty> operator<<(const valarray<_Ty>& _L,
  376. const valarray<_Ty>& _R)
  377. {_VALOP(_Ty, _L.size(), _L[_I] << _R[_I]); }
  378. template<class _Ty> inline
  379. valarray<_Ty> operator>>(const valarray<_Ty>& _L,
  380. const valarray<_Ty>& _R)
  381. {_VALOP(_Ty, _L.size(), _L[_I] >> _R[_I]); }
  382. template<class _Ty> inline
  383. _Boolarray operator&&(const valarray<_Ty>& _L,
  384. const valarray<_Ty>& _R)
  385. {_VALOP(_Bool, _L.size(), _L[_I] && _R[_I]); }
  386. template<class _Ty> inline
  387. _Boolarray operator||(const valarray<_Ty>& _L,
  388. const valarray<_Ty>& _R)
  389. {_VALOP(_Bool, _L.size(), _L[_I] || _R[_I]); }
  390. template<class _Ty> inline
  391. _Boolarray operator==(const valarray<_Ty>& _L,
  392. const _Ty& _R)
  393. {_VALOP(_Bool, _L.size(), _L[_I] == _R); }
  394. template<class _Ty> inline
  395. _Boolarray operator==(const _Ty& _L,
  396. const valarray<_Ty>& _R)
  397. {_VALOP(_Bool, _R.size(), _L == _R[_I]); }
  398. template<class _Ty> inline
  399. _Boolarray operator==(const valarray<_Ty>& _L,
  400. const valarray<_Ty>& _R)
  401. {_VALOP(_Bool, _L.size(), _L[_I] == _R[_I]); }
  402. template<class _Ty> inline
  403. _Boolarray operator!=(const valarray<_Ty>& _L,
  404. const _Ty& _R)
  405. {_VALOP(_Bool, _L.size(), _L[_I] != _R); }
  406. template<class _Ty> inline
  407. _Boolarray operator!=(const _Ty& _L,
  408. const valarray<_Ty>& _R)
  409. {_VALOP(_Bool, _R.size(), _L != _R[_I]); }
  410. template<class _Ty> inline
  411. _Boolarray operator!=(const valarray<_Ty>& _L,
  412. const valarray<_Ty>& _R)
  413. {_VALOP(_Bool, _L.size(), _L[_I] != _R[_I]); }
  414. template<class _Ty> inline
  415. _Boolarray operator<(const valarray<_Ty>& _L,
  416. const _Ty& _R)
  417. {_VALOP(_Bool, _L.size(), _L[_I] < _R); }
  418. template<class _Ty> inline
  419. _Boolarray operator<(const _Ty& _L,
  420. const valarray<_Ty>& _R)
  421. {_VALOP(_Bool, _R.size(), _L < _R[_I]); }
  422. template<class _Ty> inline
  423. _Boolarray operator<(const valarray<_Ty>& _L,
  424. const valarray<_Ty>& _R)
  425. {_VALOP(_Bool, _L.size(), _L[_I] < _R[_I]); }
  426. template<class _Ty> inline
  427. _Boolarray operator>(const valarray<_Ty>& _L,
  428. const _Ty& _R)
  429. {_VALOP(_Bool, _L.size(), _L[_I] > _R); }
  430. template<class _Ty> inline
  431. _Boolarray operator>(const _Ty& _L,
  432. const valarray<_Ty>& _R)
  433. {_VALOP(_Bool, _R.size(), _L > _R[_I]); }
  434. template<class _Ty> inline
  435. _Boolarray operator>(const valarray<_Ty>& _L,
  436. const valarray<_Ty>& _R)
  437. {_VALOP(_Bool, _L.size(), _L[_I] > _R[_I]); }
  438. template<class _Ty> inline
  439. _Boolarray operator<=(const valarray<_Ty>& _L,
  440. const _Ty& _R)
  441. {_VALOP(_Bool, _L.size(), _L[_I] <= _R); }
  442. template<class _Ty> inline
  443. _Boolarray operator<=(const _Ty& _L,
  444. const valarray<_Ty>& _R)
  445. {_VALOP(_Bool, _R.size(), _L <= _R[_I]); }
  446. template<class _Ty> inline
  447. _Boolarray operator<=(const valarray<_Ty>& _L,
  448. const valarray<_Ty>& _R)
  449. {_VALOP(_Bool, _L.size(), _L[_I] <= _R[_I]); }
  450. template<class _Ty> inline
  451. _Boolarray operator>=(const valarray<_Ty>& _L,
  452. const _Ty& _R)
  453. {_VALOP(_Bool, _L.size(), _L[_I] >= _R); }
  454. template<class _Ty> inline
  455. _Boolarray operator>=(const _Ty& _L,
  456. const valarray<_Ty>& _R)
  457. {_VALOP(_Bool, _R.size(), _L >= _R[_I]); }
  458. template<class _Ty> inline
  459. _Boolarray operator>=(const valarray<_Ty>& _L,
  460. const valarray<_Ty>& _R)
  461. {_VALOP(_Bool, _L.size(), _L[_I] >= _R[_I]); }
  462. template<class _Ty> inline
  463. valarray<_Ty> abs(const valarray<_Ty>& _X)
  464. {_VALOP(_Ty, _X.size(), ::abs(_X[_I])); }
  465. template<class _Ty> inline
  466. valarray<_Ty> acos(const valarray<_Ty>& _X)
  467. {_VALOP(_Ty, _X.size(), ::acos(_X[_I])); }
  468. template<class _Ty> inline
  469. valarray<_Ty> asin(const valarray<_Ty>& _X)
  470. {_VALOP(_Ty, _X.size(), ::asin(_X[_I])); }
  471. template<class _Ty> inline
  472. valarray<_Ty> atan(const valarray<_Ty>& _X)
  473. {_VALOP(_Ty, _X.size(), ::atan(_X[_I])); }
  474. template<class _Ty> inline
  475. valarray<_Ty> atan2(const valarray<_Ty>& _X,
  476. const valarray<_Ty>& _Y)
  477. {_VALOP(_Ty, _X.size(), ::atan2(_X[_I], _Y[_I])); }
  478. template<class _Ty> inline
  479. valarray<_Ty> atan2(const valarray<_Ty>& _X, const _Ty& _Y)
  480. {_VALOP(_Ty, _X.size(), ::atan2(_X[_I], _Y)); }
  481. template<class _Ty> inline
  482. valarray<_Ty> atan2(const _Ty& _X, const valarray<_Ty>& _Y)
  483. {_VALOP(_Ty, _Y.size(), ::atan2(_X, _Y[_I])); }
  484. template<class _Ty> inline
  485. valarray<_Ty> cos(const valarray<_Ty>& _X)
  486. {_VALOP(_Ty, _X.size(), ::cos(_X[_I])); }
  487. template<class _Ty> inline
  488. valarray<_Ty> cosh(const valarray<_Ty>& _X)
  489. {_VALOP(_Ty, _X.size(), ::cosh(_X[_I])); }
  490. template<class _Ty> inline
  491. valarray<_Ty> exp(const valarray<_Ty>& _X)
  492. {_VALOP(_Ty, _X.size(), ::exp(_X[_I])); }
  493. template<class _Ty> inline
  494. valarray<_Ty> log(const valarray<_Ty>& _X)
  495. {_VALOP(_Ty, _X.size(), ::log(_X[_I])); }
  496. template<class _Ty> inline
  497. valarray<_Ty> log10(const valarray<_Ty>& _X)
  498. {_VALOP(_Ty, _X.size(), ::log10(_X[_I])); }
  499. template<class _Ty> inline
  500. valarray<_Ty> pow(const valarray<_Ty>& _X,
  501. const valarray<_Ty>& _Y)
  502. {_VALOP(_Ty, _X.size(), ::pow(_X[_I], _Y[_I])); }
  503. template<class _Ty> inline
  504. valarray<_Ty> pow(const valarray<_Ty>& _X, const _Ty& _Y)
  505. {_VALOP(_Ty, _X.size(), ::pow(_X[_I], _Y)); }
  506. template<class _Ty> inline
  507. valarray<_Ty> pow(const _Ty& _X, const valarray<_Ty>& _Y)
  508. {_VALOP(_Ty, _Y.size(), ::pow(_X, _Y[_I])); }
  509. template<class _Ty> inline
  510. valarray<_Ty> sin(const valarray<_Ty>& _X)
  511. {_VALOP(_Ty, _X.size(), ::sin(_X[_I])); }
  512. template<class _Ty> inline
  513. valarray<_Ty> sinh(const valarray<_Ty>& _X)
  514. {_VALOP(_Ty, _X.size(), ::sinh(_X[_I])); }
  515. template<class _Ty> inline
  516. valarray<_Ty> sqrt(const valarray<_Ty>& _X)
  517. {_VALOP(_Ty, _X.size(), ::sqrt(_X[_I])); }
  518. template<class _Ty> inline
  519. valarray<_Ty> tan(const valarray<_Ty>& _X)
  520. {_VALOP(_Ty, _X.size(), ::tan(_X[_I])); }
  521. template<class _Ty> inline
  522. valarray<_Ty> tanh(const valarray<_Ty>& _X)
  523. {_VALOP(_Ty, _X.size(), ::tanh(_X[_I])); }
  524. // CLASS slice
  525. class slice {
  526. public:
  527. slice()
  528. : _Start(0), _Len(0), _Stride(0) {}
  529. slice(size_t _S, size_t _L, size_t _D)
  530. : _Start(_S), _Len(_L), _Stride(_D) {}
  531. size_t start() const
  532. {return (_Start); }
  533. size_t size() const
  534. {return (_Len); }
  535. size_t stride() const
  536. {return (_Stride); }
  537. protected:
  538. size_t _Start, _Len, _Stride;
  539. };
  540. // TEMPLATE CLASS slice_array
  541. #define _SLOP(RHS) \
  542. size_t _N = _Start; \
  543. for (size_t _I = 0; _I < _Len; ++_I, _N += _Stride) \
  544. _Ptr[_N] RHS;
  545. #define _SLOP2(RHS) \
  546. size_t _N = _L.start(); \
  547. for (size_t _I = 0; _I < _L.size(); \
  548. ++_I, _N += _L.stride()) \
  549. _L._Data(_N) RHS;
  550. template<class _Ty>
  551. class slice_array : public slice {
  552. public:
  553. typedef _Ty value_type;
  554. void operator=(const valarray<_Ty>& _R) const
  555. {_SLOP(= _R[_I]); }
  556. void operator=(const _Ty& _R)
  557. {_SLOP(= _R); }
  558. _Ty& _Data(size_t _I) const
  559. {return (_Ptr[_I]); }
  560. private:
  561. friend class valarray<_Ty>;
  562. slice_array(const slice& _Sl, _Ty *_Pd)
  563. : slice(_Sl), _Ptr(_Pd) {}
  564. _Ty *_Ptr;
  565. };
  566. // slice_array MEMBER TEMPLATE OPERATORS
  567. template<class _Ty> inline
  568. void operator*=(const slice_array<_Ty>& _L,
  569. const valarray<_Ty>& _R)
  570. {_SLOP2(*= _R[_I]); }
  571. template<class _Ty> inline
  572. void operator/=(const slice_array<_Ty>& _L,
  573. const valarray<_Ty>& _R)
  574. {_SLOP2(/= _R[_I]); }
  575. template<class _Ty> inline
  576. void operator%=(const slice_array<_Ty>& _L,
  577. const valarray<_Ty>& _R)
  578. {_SLOP2(%= _R[_I]); }
  579. template<class _Ty> inline
  580. void operator+=(const slice_array<_Ty>& _L,
  581. const valarray<_Ty>& _R)
  582. {_SLOP2(+= _R[_I]); }
  583. template<class _Ty> inline
  584. void operator-=(const slice_array<_Ty>& _L,
  585. const valarray<_Ty>& _R)
  586. {_SLOP2(-= _R[_I]); }
  587. template<class _Ty> inline
  588. void operator^=(const slice_array<_Ty>& _L,
  589. const valarray<_Ty>& _R)
  590. {_SLOP2(^= _R[_I]); }
  591. template<class _Ty> inline
  592. void operator&=(const slice_array<_Ty>& _L,
  593. const valarray<_Ty>& _R)
  594. {_SLOP2(&= _R[_I]); }
  595. template<class _Ty> inline
  596. void operator|=(const slice_array<_Ty>& _L,
  597. const valarray<_Ty>& _R)
  598. {_SLOP2(|= _R[_I]); }
  599. template<class _Ty> inline
  600. void operator<<=(const slice_array<_Ty>& _L,
  601. const valarray<_Ty>& _R)
  602. {_SLOP2(<<= _R[_I]); }
  603. template<class _Ty> inline
  604. void operator>>=(const slice_array<_Ty>& _L,
  605. const valarray<_Ty>& _R)
  606. {_SLOP2(>>= _R[_I]); }
  607. // CLASS gslice
  608. class gslice {
  609. public:
  610. gslice()
  611. : _Start(0) {}
  612. gslice(size_t _S, const _Sizarray& _L,
  613. const _Sizarray& _D)
  614. : _Start(_S), _Len(_L), _Stride(_D) {}
  615. size_t start() const
  616. {return (_Start); }
  617. _Sizarray size() const
  618. {return (_Len); }
  619. _Sizarray stride() const
  620. {return (_Stride); }
  621. size_t _Nslice() const
  622. {return (_Len.size()); }
  623. size_t _Off(_Sizarray& _Idx) const
  624. {size_t _I, _K = _Start;
  625. for (_I = 0; _I < _Idx.size(); ++_I)
  626. _K += _Idx[_I] * _Stride[_I];
  627. while (0 < _I--)
  628. if (++_Idx[_I] < _Len[_I])
  629. break;
  630. else
  631. _Idx[_I] = 0;
  632. return (_K); }
  633. size_t _Totlen() const
  634. {if (_Len.size() == 0)
  635. return (0);
  636. size_t _L = _Len[0];
  637. for (size_t _I = 0; ++_I < _Len.size(); )
  638. _L *= _Len[_I];
  639. return (_L); }
  640. private:
  641. size_t _Start;
  642. _Sizarray _Len;
  643. _Sizarray _Stride;
  644. };
  645. // TEMPLATE CLASS gslice_array
  646. #define _GSLOP(RHS) \
  647. _Sizarray _Idx((size_t)0, _Nslice()); \
  648. size_t _N = _Totlen(); \
  649. for (size_t _I = 0; _I < _N; ++_I) \
  650. _Ptr[_Off(_Idx)] RHS;
  651. #define _GSLOP2(RHS) \
  652. _Sizarray _Idx((size_t)0, _L._Nslice()); \
  653. size_t _N = _L._Totlen(); \
  654. for (size_t _I = 0; _I < _N; ++_I) \
  655. _L._Data(_L._Off(_Idx)) RHS;
  656. template<class _Ty>
  657. class gslice_array : public gslice {
  658. public:
  659. typedef _Ty value_type;
  660. void operator=(const valarray<_Ty>& _R) const
  661. {_GSLOP(= _R[_I]); }
  662. void operator=(const _Ty& _R)
  663. {_GSLOP(= _R); }
  664. _Ty& _Data(size_t _I) const
  665. {return (_Ptr[_I]); }
  666. private:
  667. friend class valarray<_Ty>;
  668. gslice_array(const gslice& _Gs, _Ty *_Pd)
  669. : gslice(_Gs), _Ptr(_Pd) {}
  670. _Ty *_Ptr;
  671. };
  672. // gslice_array MEMBER TEMPLATE OPERATORS
  673. template<class _Ty> inline
  674. void operator*=(const gslice_array<_Ty>& _L,
  675. const valarray<_Ty>& _R)
  676. {_GSLOP2(*= _R[_I]); }
  677. template<class _Ty> inline
  678. void operator/=(const gslice_array<_Ty>& _L,
  679. const valarray<_Ty>& _R)
  680. {_GSLOP2(/= _R[_I]); }
  681. template<class _Ty> inline
  682. void operator%=(const gslice_array<_Ty>& _L,
  683. const valarray<_Ty>& _R)
  684. {_GSLOP2(%= _R[_I]); }
  685. template<class _Ty> inline
  686. void operator+=(const gslice_array<_Ty>& _L,
  687. const valarray<_Ty>& _R)
  688. {_GSLOP2(+= _R[_I]); }
  689. template<class _Ty> inline
  690. void operator-=(const gslice_array<_Ty>& _L,
  691. const valarray<_Ty>& _R)
  692. {_GSLOP2(-= _R[_I]); }
  693. template<class _Ty> inline
  694. void operator^=(const gslice_array<_Ty>& _L,
  695. const valarray<_Ty>& _R)
  696. {_GSLOP2(^= _R[_I]); }
  697. template<class _Ty> inline
  698. void operator&=(const gslice_array<_Ty>& _L,
  699. const valarray<_Ty>& _R)
  700. {_GSLOP2(&= _R[_I]); }
  701. template<class _Ty> inline
  702. void operator|=(const gslice_array<_Ty>& _L,
  703. const valarray<_Ty>& _R)
  704. {_GSLOP2(|= _R[_I]); }
  705. template<class _Ty> inline
  706. void operator<<=(const gslice_array<_Ty>& _L,
  707. const valarray<_Ty>& _R)
  708. {_GSLOP2(<<= _R[_I]); }
  709. template<class _Ty> inline
  710. void operator>>=(const gslice_array<_Ty>& _L,
  711. const valarray<_Ty>& _R)
  712. {_GSLOP2(>>= _R[_I]); }
  713. // TEMPLATE CLASS mask_array
  714. #define _MOP(RHS) \
  715. size_t _N = 0; \
  716. size_t _M = _Totlen(); \
  717. for (size_t _I = 0; _I < _M; ++_N) \
  718. if (_Mask(_N)) \
  719. _Ptr[_N] RHS, ++_I;
  720. #define _MOP2(RHS) \
  721. size_t _N = 0; \
  722. size_t _M = _L._Totlen(); \
  723. for (size_t _I = 0; _I < _M; ++_N) \
  724. if (_L._Mask(_N)) \
  725. _L._Data(_N) RHS, ++_I;
  726. template<class _Ty>
  727. class mask_array {
  728. public:
  729. typedef _Ty value_type;
  730. void operator=(const valarray<_Ty>& _R)
  731. {_MOP(= _R[_I]); }
  732. void operator=(const _Ty& _R)
  733. {_MOP(= _R); }
  734. _Ty& _Data(size_t _I) const
  735. {return (_Ptr[_I]); }
  736. bool _Mask(size_t _I) const
  737. {return (_Marr[_I]); }
  738. size_t _Totlen() const
  739. {size_t _N = 0;
  740. for (size_t _I = 0; _I < _Marr.size(); ++_I)
  741. if (_Marr[_I])
  742. ++_N;
  743. return (_N); }
  744. private:
  745. friend class valarray<_Ty>;
  746. mask_array(const _Boolarray& _Ma, _Ty *_Pd)
  747. : _Marr(_Ma), _Ptr(_Pd) {}
  748. _Boolarray _Marr;
  749. _Ty *_Ptr;
  750. };
  751. // mask_array MEMBER TEMPLATE OPERATORS
  752. template<class _Ty> inline
  753. void operator*=(const mask_array<_Ty>& _L,
  754. const valarray<_Ty>& _R)
  755. {_MOP2(*= _R[_I]); }
  756. template<class _Ty> inline
  757. void operator/=(const mask_array<_Ty>& _L,
  758. const valarray<_Ty>& _R)
  759. {_MOP2(/= _R[_I]); }
  760. template<class _Ty> inline
  761. void operator%=(const mask_array<_Ty>& _L,
  762. const valarray<_Ty>& _R)
  763. {_MOP2(%= _R[_I]); }
  764. template<class _Ty> inline
  765. void operator+=(const mask_array<_Ty>& _L,
  766. const valarray<_Ty>& _R)
  767. {_MOP2(+= _R[_I]); }
  768. template<class _Ty> inline
  769. void operator-=(const mask_array<_Ty>& _L,
  770. const valarray<_Ty>& _R)
  771. {_MOP2(-= _R[_I]); }
  772. template<class _Ty> inline
  773. void operator^=(const mask_array<_Ty>& _L,
  774. const valarray<_Ty>& _R)
  775. {_MOP2(^= _R[_I]); }
  776. template<class _Ty> inline
  777. void operator&=(const mask_array<_Ty>& _L,
  778. const valarray<_Ty>& _R)
  779. {_MOP2(&= _R[_I]); }
  780. template<class _Ty> inline
  781. void operator|=(const mask_array<_Ty>& _L,
  782. const valarray<_Ty>& _R)
  783. {_MOP2(|= _R[_I]); }
  784. template<class _Ty> inline
  785. void operator<<=(const mask_array<_Ty>& _L,
  786. const valarray<_Ty>& _R)
  787. {_MOP2(<<= _R[_I]); }
  788. template<class _Ty> inline
  789. void operator>>=(const mask_array<_Ty>& _L,
  790. const valarray<_Ty>& _R)
  791. {_MOP2(>>= _R[_I]); }
  792. // TEMPLATE CLASS indirect_array
  793. #define _IOP(RHS) \
  794. size_t _L = _Totlen(); \
  795. for (size_t _I = 0; _I < _L; ++_I) \
  796. _Ptr[_Indir(_I)] RHS;
  797. #define _IOP2(RHS) \
  798. size_t _N = _L._Totlen(); \
  799. for (size_t _I = 0; _I < _N; ++_I) \
  800. _L._Data(_L._Indir(_I)) RHS;
  801. template<class _Ty>
  802. class indirect_array {
  803. public:
  804. typedef _Ty value_type;
  805. void operator=(const valarray<_Ty>& _R) const
  806. {_IOP(= _R[_I]); }
  807. void operator=(const _Ty& _R)
  808. {_IOP(= _R); }
  809. _Ty& _Data(size_t _I) const
  810. {return (_Ptr[_I]); }
  811. size_t _Indir(size_t _I) const
  812. {return (_Iarr[_I]); }
  813. size_t _Totlen() const
  814. {return (_Iarr.size()); }
  815. private:
  816. friend class valarray<_Ty>;
  817. indirect_array(const _Sizarray& _Ia, _Ty *_Pd)
  818. : _Iarr(_Ia), _Ptr(_Pd) {}
  819. _Sizarray _Iarr;
  820. _Ty *_Ptr;
  821. };
  822. // indirect_array MEMBER TEMPLATE OPERATORS
  823. template<class _Ty> inline
  824. void operator*=(const indirect_array<_Ty>& _L,
  825. const valarray<_Ty>& _R)
  826. {_IOP2(*= _R[_I]); }
  827. template<class _Ty> inline
  828. void operator/=(const indirect_array<_Ty>& _L,
  829. const valarray<_Ty>& _R)
  830. {_IOP2(/= _R[_I]); }
  831. template<class _Ty> inline
  832. void operator%=(const indirect_array<_Ty>& _L,
  833. const valarray<_Ty>& _R)
  834. {_IOP2(%= _R[_I]); }
  835. template<class _Ty> inline
  836. void operator+=(const indirect_array<_Ty>& _L,
  837. const valarray<_Ty>& _R)
  838. {_IOP2(+= _R[_I]); }
  839. template<class _Ty> inline
  840. void operator-=(const indirect_array<_Ty>& _L,
  841. const valarray<_Ty>& _R)
  842. {_IOP2(-= _R[_I]); }
  843. template<class _Ty> inline
  844. void operator^=(const indirect_array<_Ty>& _L,
  845. const valarray<_Ty>& _R)
  846. {_IOP2(^= _R[_I]); }
  847. template<class _Ty> inline
  848. void operator&=(const indirect_array<_Ty>& _L,
  849. const valarray<_Ty>& _R)
  850. {_IOP2(&= _R[_I]); }
  851. template<class _Ty> inline
  852. void operator|=(const indirect_array<_Ty>& _L,
  853. const valarray<_Ty>& _R)
  854. {_IOP2(|= _R[_I]); }
  855. template<class _Ty> inline
  856. void operator<<=(const indirect_array<_Ty>& _L,
  857. const valarray<_Ty>& _R)
  858. {_IOP2(<<= _R[_I]); }
  859. template<class _Ty> inline
  860. void operator>>=(const indirect_array<_Ty>& _L,
  861. const valarray<_Ty>& _R)
  862. {_IOP2(>>= _R[_I]); }
  863. // slice_array TEMPLATE FUNCTIONS
  864. template<class _Ty> inline
  865. valarray<_Ty>& valarray<_Ty>::operator=(
  866. const slice_array<_Ty>& _Sl)
  867. {_Grow(_Sl.size(), &_Sl._Data(_Sl.start()),
  868. _Sl.stride(), true);
  869. return (*this); }
  870. template<class _Ty> inline
  871. valarray<_Ty> valarray<_Ty>::operator[](slice _Sl) const
  872. {return (valarray<_Ty>(slice_array<_Ty>(_Sl, _Ptr))); }
  873. template<class _Ty> inline
  874. slice_array<_Ty> valarray<_Ty>::operator[](slice _Sl)
  875. {return (slice_array<_Ty>(_Sl, _Ptr)); }
  876. // gslice_array TEMPLATE FUNCTIONS
  877. template<class _Ty> inline
  878. valarray<_Ty>& valarray<_Ty>::operator=(
  879. const gslice_array<_Ty>& _Gs)
  880. {_Grow(_Gs._Totlen(), 0, 0, true);
  881. _Sizarray _Idx((size_t)0, _Gs._Nslice());
  882. _VALGOP(= _Gs._Data(_Gs._Off(_Idx))); }
  883. template<class _Ty> inline
  884. valarray<_Ty> valarray<_Ty>::operator[](
  885. const gslice& _Gs) const
  886. {return (valarray<_Ty>(gslice_array<_Ty>(_Gs, _Ptr))); }
  887. template<class _Ty> inline
  888. gslice_array<_Ty> valarray<_Ty>::operator[](
  889. const gslice& _Gs)
  890. {return (gslice_array<_Ty>(_Gs, _Ptr)); }
  891. // mask_array TEMPLATE FUNCTIONS
  892. template<class _Ty> inline
  893. valarray<_Ty>& valarray<_Ty>::operator=(
  894. const mask_array<_Ty>& _Ma)
  895. {_Grow(_Ma._Totlen(), 0, 0, true);
  896. size_t _N = 0;
  897. for (size_t _I = 0; _I < size(); ++_N)
  898. if (_Ma._Mask(_N))
  899. _Ptr[_I++] = _Ma._Data(_N);
  900. return (*this); }
  901. template<class _Ty> inline
  902. valarray<_Ty> valarray<_Ty>::operator[](
  903. const _Boolarray& _Ba) const
  904. {return (valarray<_Ty>(mask_array<_Ty>(_Ba, _Ptr))); }
  905. template<class _Ty> inline
  906. mask_array<_Ty> valarray<_Ty>::operator[](
  907. const _Boolarray& _Ba)
  908. {return (mask_array<_Ty>(_Ba, _Ptr)); }
  909. // indirect_array TEMPLATE FUNCTIONS
  910. template<class _Ty> inline
  911. valarray<_Ty>& valarray<_Ty>::operator=(
  912. const indirect_array<_Ty>& _Ia)
  913. {_Grow(_Ia._Totlen(), 0, 0, true);
  914. _VALGOP(= _Ia._Data(_Ia._Indir(_I))); }
  915. template<class _Ty> inline
  916. valarray<_Ty> valarray<_Ty>::operator[](
  917. const _Sizarray& _Ia) const
  918. {return (valarray<_Ty>(indirect_array<_Ty>(_Ia, _Ptr))); }
  919. template<class _Ty> inline
  920. indirect_array<_Ty> valarray<_Ty>::operator[](
  921. const _Sizarray& _Ia)
  922. {return (indirect_array<_Ty>(_Ia, _Ptr)); }
  923. _STD_END
  924. #ifdef _MSC_VER
  925. #pragma pack(pop)
  926. #endif /* _MSC_VER */
  927. #endif /* _VALARRAY_ */
  928. /*
  929. * Copyright (c) 1995 by P.J. Plauger. ALL RIGHTS RESERVED.
  930. * Consult your license regarding permissions and restrictions.
  931. */