1 // 2 // Copyright (c) 2002-2003 3 // Toon Knapen, Kresimir Fresl, Joerg Walter 4 // 5 // Distributed under the Boost Software License, Version 1.0. (See 6 // accompanying file LICENSE_1_0.txt or copy at 7 // http://www.boost.org/LICENSE_1_0.txt) 8 // 9 // 10 11 #ifndef _BOOST_UBLAS_RAW_ 12 #define _BOOST_UBLAS_RAW_ 13 14 namespace boost { namespace numeric { namespace ublas { namespace raw { 15 16 // We need data_const() mostly due to MSVC 6.0. 17 // But how shall we write portable code otherwise? 18 19 template < typename V > 20 BOOST_UBLAS_INLINE 21 int size( const V &v ) ; 22 23 template < typename V > 24 BOOST_UBLAS_INLINE 25 int size( const vector_reference<V> &v ) ; 26 27 template < typename M > 28 BOOST_UBLAS_INLINE 29 int size1( const M &m ) ; 30 template < typename M > 31 BOOST_UBLAS_INLINE 32 int size2( const M &m ) ; 33 34 template < typename M > 35 BOOST_UBLAS_INLINE 36 int size1( const matrix_reference<M> &m ) ; 37 template < typename M > 38 BOOST_UBLAS_INLINE 39 int size2( const matrix_reference<M> &m ) ; 40 41 template < typename M > 42 BOOST_UBLAS_INLINE 43 int leading_dimension( const M &m, row_major_tag ) ; 44 template < typename M > 45 BOOST_UBLAS_INLINE 46 int leading_dimension( const M &m, column_major_tag ) ; 47 template < typename M > 48 BOOST_UBLAS_INLINE 49 int leading_dimension( const M &m ) ; 50 51 template < typename M > 52 BOOST_UBLAS_INLINE 53 int leading_dimension( const matrix_reference<M> &m ) ; 54 55 template < typename V > 56 BOOST_UBLAS_INLINE 57 int stride( const V &v ) ; 58 59 template < typename V > 60 BOOST_UBLAS_INLINE 61 int stride( const vector_range<V> &v ) ; 62 template < typename V > 63 BOOST_UBLAS_INLINE 64 int stride( const vector_slice<V> &v ) ; 65 66 template < typename M > 67 BOOST_UBLAS_INLINE 68 int stride( const matrix_row<M> &v ) ; 69 template < typename M > 70 BOOST_UBLAS_INLINE 71 int stride( const matrix_column<M> &v ) ; 72 73 template < typename M > 74 BOOST_UBLAS_INLINE 75 int stride1( const M &m ) ; 76 template < typename M > 77 BOOST_UBLAS_INLINE 78 int stride2( const M &m ) ; 79 80 template < typename M > 81 BOOST_UBLAS_INLINE 82 int stride1( const matrix_reference<M> &m ) ; 83 template < typename M > 84 BOOST_UBLAS_INLINE 85 int stride2( const matrix_reference<M> &m ) ; 86 87 template < typename T, std::size_t M, std::size_t N > 88 BOOST_UBLAS_INLINE 89 int stride1( const c_matrix<T, M, N> &m ) ; 90 template < typename T, std::size_t M, std::size_t N > 91 BOOST_UBLAS_INLINE 92 int stride2( const c_matrix<T, M, N> &m ) ; 93 94 template < typename M > 95 BOOST_UBLAS_INLINE 96 int stride1( const matrix_range<M> &m ) ; 97 template < typename M > 98 BOOST_UBLAS_INLINE 99 int stride1( const matrix_slice<M> &m ) ; 100 template < typename M > 101 BOOST_UBLAS_INLINE 102 int stride2( const matrix_range<M> &m ) ; 103 template < typename M > 104 BOOST_UBLAS_INLINE 105 int stride2( const matrix_slice<M> &m ) ; 106 107 template < typename MV > 108 BOOST_UBLAS_INLINE 109 typename MV::array_type::array_type::const_pointer data( const MV &mv ) ; 110 template < typename MV > 111 BOOST_UBLAS_INLINE 112 typename MV::array_type::array_type::const_pointer data_const( const MV &mv ) ; 113 template < typename MV > 114 BOOST_UBLAS_INLINE 115 typename MV::array_type::pointer data( MV &mv ) ; 116 117 template < typename V > 118 BOOST_UBLAS_INLINE 119 typename V::array_type::array_type::const_pointer data( const vector_reference<V> &v ) ; 120 template < typename V > 121 BOOST_UBLAS_INLINE 122 typename V::array_type::array_type::const_pointer data_const( const vector_reference<V> &v ) ; 123 template < typename V > 124 BOOST_UBLAS_INLINE 125 typename V::array_type::pointer data( vector_reference<V> &v ) ; 126 127 template < typename T, std::size_t N > 128 BOOST_UBLAS_INLINE 129 typename c_vector<T, N>::array_type::array_type::const_pointer data( const c_vector<T, N> &v ) ; 130 template < typename T, std::size_t N > 131 BOOST_UBLAS_INLINE 132 typename c_vector<T, N>::array_type::array_type::const_pointer data_const( const c_vector<T, N> &v ) ; 133 template < typename T, std::size_t N > 134 BOOST_UBLAS_INLINE 135 typename c_vector<T, N>::pointer data( c_vector<T, N> &v ) ; 136 137 template < typename V > 138 BOOST_UBLAS_INLINE 139 typename V::array_type::array_type::const_pointer data( const vector_range<V> &v ) ; 140 template < typename V > 141 BOOST_UBLAS_INLINE 142 typename V::array_type::array_type::const_pointer data( const vector_slice<V> &v ) ; 143 template < typename V > 144 BOOST_UBLAS_INLINE 145 typename V::array_type::array_type::const_pointer data_const( const vector_range<V> &v ) ; 146 template < typename V > 147 BOOST_UBLAS_INLINE 148 typename V::array_type::array_type::const_pointer data_const( const vector_slice<V> &v ) ; 149 template < typename V > 150 BOOST_UBLAS_INLINE 151 typename V::array_type::pointer data( vector_range<V> &v ) ; 152 template < typename V > 153 BOOST_UBLAS_INLINE 154 typename V::array_type::pointer data( vector_slice<V> &v ) ; 155 156 template < typename M > 157 BOOST_UBLAS_INLINE 158 typename M::array_type::array_type::const_pointer data( const matrix_reference<M> &m ) ; 159 template < typename M > 160 BOOST_UBLAS_INLINE 161 typename M::array_type::array_type::const_pointer data_const( const matrix_reference<M> &m ) ; 162 template < typename M > 163 BOOST_UBLAS_INLINE 164 typename M::array_type::pointer data( matrix_reference<M> &m ) ; 165 166 template < typename T, std::size_t M, std::size_t N > 167 BOOST_UBLAS_INLINE 168 typename c_matrix<T, M, N>::array_type::array_type::const_pointer data( const c_matrix<T, M, N> &m ) ; 169 template < typename T, std::size_t M, std::size_t N > 170 BOOST_UBLAS_INLINE 171 typename c_matrix<T, M, N>::array_type::array_type::const_pointer data_const( const c_matrix<T, M, N> &m ) ; 172 template < typename T, std::size_t M, std::size_t N > 173 BOOST_UBLAS_INLINE 174 typename c_matrix<T, M, N>::pointer data( c_matrix<T, M, N> &m ) ; 175 176 template < typename M > 177 BOOST_UBLAS_INLINE 178 typename M::array_type::array_type::const_pointer data( const matrix_row<M> &v ) ; 179 template < typename M > 180 BOOST_UBLAS_INLINE 181 typename M::array_type::array_type::const_pointer data( const matrix_column<M> &v ) ; 182 template < typename M > 183 BOOST_UBLAS_INLINE 184 typename M::array_type::array_type::const_pointer data_const( const matrix_row<M> &v ) ; 185 template < typename M > 186 BOOST_UBLAS_INLINE 187 typename M::array_type::array_type::const_pointer data_const( const matrix_column<M> &v ) ; 188 template < typename M > 189 BOOST_UBLAS_INLINE 190 typename M::array_type::pointer data( matrix_row<M> &v ) ; 191 template < typename M > 192 BOOST_UBLAS_INLINE 193 typename M::array_type::pointer data( matrix_column<M> &v ) ; 194 195 template < typename M > 196 BOOST_UBLAS_INLINE 197 typename M::array_type::array_type::const_pointer data( const matrix_range<M> &m ) ; 198 template < typename M > 199 BOOST_UBLAS_INLINE 200 typename M::array_type::array_type::const_pointer data( const matrix_slice<M> &m ) ; 201 template < typename M > 202 BOOST_UBLAS_INLINE 203 typename M::array_type::array_type::const_pointer data_const( const matrix_range<M> &m ) ; 204 template < typename M > 205 BOOST_UBLAS_INLINE 206 typename M::array_type::array_type::const_pointer data_const( const matrix_slice<M> &m ) ; 207 template < typename M > 208 BOOST_UBLAS_INLINE 209 typename M::array_type::pointer data( matrix_range<M> &m ) ; 210 template < typename M > 211 BOOST_UBLAS_INLINE 212 typename M::array_type::pointer data( matrix_slice<M> &m ) ; 213 214 template < typename MV > 215 BOOST_UBLAS_INLINE 216 typename MV::array_type::array_type::const_pointer base( const MV &mv ) ; 217 218 template < typename MV > 219 BOOST_UBLAS_INLINE 220 typename MV::array_type::array_type::const_pointer base_const( const MV &mv ) ; 221 template < typename MV > 222 BOOST_UBLAS_INLINE 223 typename MV::array_type::pointer base( MV &mv ) ; 224 225 template < typename V > 226 BOOST_UBLAS_INLINE 227 typename V::array_type::array_type::const_pointer base( const vector_reference<V> &v ) ; 228 template < typename V > 229 BOOST_UBLAS_INLINE 230 typename V::array_type::array_type::const_pointer base_const( const vector_reference<V> &v ) ; 231 template < typename V > 232 BOOST_UBLAS_INLINE 233 typename V::array_type::pointer base( vector_reference<V> &v ) ; 234 235 template < typename T, std::size_t N > 236 BOOST_UBLAS_INLINE 237 typename c_vector<T, N>::array_type::array_type::const_pointer base( const c_vector<T, N> &v ) ; 238 template < typename T, std::size_t N > 239 BOOST_UBLAS_INLINE 240 typename c_vector<T, N>::array_type::array_type::const_pointer base_const( const c_vector<T, N> &v ) ; 241 template < typename T, std::size_t N > 242 BOOST_UBLAS_INLINE 243 typename c_vector<T, N>::pointer base( c_vector<T, N> &v ) ; 244 245 template < typename V > 246 BOOST_UBLAS_INLINE 247 typename V::array_type::array_type::const_pointer base( const vector_range<V> &v ) ; 248 template < typename V > 249 BOOST_UBLAS_INLINE 250 typename V::array_type::array_type::const_pointer base( const vector_slice<V> &v ) ; 251 template < typename V > 252 BOOST_UBLAS_INLINE 253 typename V::array_type::array_type::const_pointer base_const( const vector_range<V> &v ) ; 254 template < typename V > 255 BOOST_UBLAS_INLINE 256 typename V::array_type::array_type::const_pointer base_const( const vector_slice<V> &v ) ; 257 template < typename V > 258 BOOST_UBLAS_INLINE 259 typename V::array_type::pointer base( vector_range<V> &v ) ; 260 template < typename V > 261 BOOST_UBLAS_INLINE 262 typename V::array_type::pointer base( vector_slice<V> &v ) ; 263 264 template < typename M > 265 BOOST_UBLAS_INLINE 266 typename M::array_type::array_type::const_pointer base( const matrix_reference<M> &m ) ; 267 template < typename M > 268 BOOST_UBLAS_INLINE 269 typename M::array_type::array_type::const_pointer base_const( const matrix_reference<M> &m ) ; 270 template < typename M > 271 BOOST_UBLAS_INLINE 272 typename M::array_type::pointer base( matrix_reference<M> &m ) ; 273 274 template < typename T, std::size_t M, std::size_t N > 275 BOOST_UBLAS_INLINE 276 typename c_matrix<T, M, N>::array_type::array_type::const_pointer base( const c_matrix<T, M, N> &m ) ; 277 template < typename T, std::size_t M, std::size_t N > 278 BOOST_UBLAS_INLINE 279 typename c_matrix<T, M, N>::array_type::array_type::const_pointer base_const( const c_matrix<T, M, N> &m ) ; 280 template < typename T, std::size_t M, std::size_t N > 281 BOOST_UBLAS_INLINE 282 typename c_matrix<T, M, N>::pointer base( c_matrix<T, M, N> &m ) ; 283 284 template < typename M > 285 BOOST_UBLAS_INLINE 286 typename M::array_type::array_type::const_pointer base( const matrix_row<M> &v ) ; 287 template < typename M > 288 BOOST_UBLAS_INLINE 289 typename M::array_type::array_type::const_pointer base( const matrix_column<M> &v ) ; 290 template < typename M > 291 BOOST_UBLAS_INLINE 292 typename M::array_type::array_type::const_pointer base_const( const matrix_row<M> &v ) ; 293 template < typename M > 294 BOOST_UBLAS_INLINE 295 typename M::array_type::array_type::const_pointer base_const( const matrix_column<M> &v ) ; 296 template < typename M > 297 BOOST_UBLAS_INLINE 298 typename M::array_type::pointer base( matrix_row<M> &v ) ; 299 template < typename M > 300 BOOST_UBLAS_INLINE 301 typename M::array_type::pointer base( matrix_column<M> &v ) ; 302 303 template < typename M > 304 BOOST_UBLAS_INLINE 305 typename M::array_type::array_type::const_pointer base( const matrix_range<M> &m ) ; 306 template < typename M > 307 BOOST_UBLAS_INLINE 308 typename M::array_type::array_type::const_pointer base( const matrix_slice<M> &m ) ; 309 template < typename M > 310 BOOST_UBLAS_INLINE 311 typename M::array_type::array_type::const_pointer base_const( const matrix_range<M> &m ) ; 312 template < typename M > 313 BOOST_UBLAS_INLINE 314 typename M::array_type::array_type::const_pointer base_const( const matrix_slice<M> &m ) ; 315 template < typename M > 316 BOOST_UBLAS_INLINE 317 typename M::array_type::pointer base( matrix_range<M> &m ) ; 318 template < typename M > 319 BOOST_UBLAS_INLINE 320 typename M::array_type::pointer base( matrix_slice<M> &m ) ; 321 322 template < typename MV > 323 BOOST_UBLAS_INLINE 324 typename MV::size_type start( const MV &mv ) ; 325 326 template < typename V > 327 BOOST_UBLAS_INLINE 328 typename V::size_type start( const vector_range<V> &v ) ; 329 template < typename V > 330 BOOST_UBLAS_INLINE 331 typename V::size_type start( const vector_slice<V> &v ) ; 332 333 template < typename M > 334 BOOST_UBLAS_INLINE 335 typename M::size_type start( const matrix_row<M> &v ) ; 336 template < typename M > 337 BOOST_UBLAS_INLINE 338 typename M::size_type start( const matrix_column<M> &v ) ; 339 340 template < typename M > 341 BOOST_UBLAS_INLINE 342 typename M::size_type start( const matrix_range<M> &m ) ; 343 template < typename M > 344 BOOST_UBLAS_INLINE 345 typename M::size_type start( const matrix_slice<M> &m ) ; 346 347 348 349 template < typename V > 350 BOOST_UBLAS_INLINE size(const V & v)351 int size( const V &v ) { 352 return v.size() ; 353 } 354 355 template < typename V > 356 BOOST_UBLAS_INLINE size(const vector_reference<V> & v)357 int size( const vector_reference<V> &v ) { 358 return size( v ) ; 359 } 360 361 template < typename M > 362 BOOST_UBLAS_INLINE size1(const M & m)363 int size1( const M &m ) { 364 return m.size1() ; 365 } 366 template < typename M > 367 BOOST_UBLAS_INLINE size2(const M & m)368 int size2( const M &m ) { 369 return m.size2() ; 370 } 371 372 template < typename M > 373 BOOST_UBLAS_INLINE size1(const matrix_reference<M> & m)374 int size1( const matrix_reference<M> &m ) { 375 return size1( m.expression() ) ; 376 } 377 template < typename M > 378 BOOST_UBLAS_INLINE size2(const matrix_reference<M> & m)379 int size2( const matrix_reference<M> &m ) { 380 return size2( m.expression() ) ; 381 } 382 383 template < typename M > 384 BOOST_UBLAS_INLINE leading_dimension(const M & m,row_major_tag)385 int leading_dimension( const M &m, row_major_tag ) { 386 return m.size2() ; 387 } 388 template < typename M > 389 BOOST_UBLAS_INLINE leading_dimension(const M & m,column_major_tag)390 int leading_dimension( const M &m, column_major_tag ) { 391 return m.size1() ; 392 } 393 template < typename M > 394 BOOST_UBLAS_INLINE leading_dimension(const M & m)395 int leading_dimension( const M &m ) { 396 return leading_dimension( m, typename M::orientation_category() ) ; 397 } 398 399 template < typename M > 400 BOOST_UBLAS_INLINE leading_dimension(const matrix_reference<M> & m)401 int leading_dimension( const matrix_reference<M> &m ) { 402 return leading_dimension( m.expression() ) ; 403 } 404 405 template < typename V > 406 BOOST_UBLAS_INLINE stride(const V & v)407 int stride( const V &v ) { 408 return 1 ; 409 } 410 411 template < typename V > 412 BOOST_UBLAS_INLINE stride(const vector_range<V> & v)413 int stride( const vector_range<V> &v ) { 414 return stride( v.data() ) ; 415 } 416 template < typename V > 417 BOOST_UBLAS_INLINE stride(const vector_slice<V> & v)418 int stride( const vector_slice<V> &v ) { 419 return v.stride() * stride( v.data() ) ; 420 } 421 422 template < typename M > 423 BOOST_UBLAS_INLINE stride(const matrix_row<M> & v)424 int stride( const matrix_row<M> &v ) { 425 return stride2( v.data() ) ; 426 } 427 template < typename M > 428 BOOST_UBLAS_INLINE stride(const matrix_column<M> & v)429 int stride( const matrix_column<M> &v ) { 430 return stride1( v.data() ) ; 431 } 432 433 template < typename M > 434 BOOST_UBLAS_INLINE stride1(const M & m)435 int stride1( const M &m ) { 436 typedef typename M::functor_type functor_type; 437 return functor_type::one1( m.size1(), m.size2() ) ; 438 } 439 template < typename M > 440 BOOST_UBLAS_INLINE stride2(const M & m)441 int stride2( const M &m ) { 442 typedef typename M::functor_type functor_type; 443 return functor_type::one2( m.size1(), m.size2() ) ; 444 } 445 446 template < typename M > 447 BOOST_UBLAS_INLINE stride1(const matrix_reference<M> & m)448 int stride1( const matrix_reference<M> &m ) { 449 return stride1( m.expression() ) ; 450 } 451 template < typename M > 452 BOOST_UBLAS_INLINE stride2(const matrix_reference<M> & m)453 int stride2( const matrix_reference<M> &m ) { 454 return stride2( m.expression() ) ; 455 } 456 457 template < typename T, std::size_t M, std::size_t N > 458 BOOST_UBLAS_INLINE stride1(const c_matrix<T,M,N> & m)459 int stride1( const c_matrix<T, M, N> &m ) { 460 return N ; 461 } 462 template < typename T, std::size_t M, std::size_t N > 463 BOOST_UBLAS_INLINE stride2(const c_matrix<T,M,N> & m)464 int stride2( const c_matrix<T, M, N> &m ) { 465 return 1 ; 466 } 467 468 template < typename M > 469 BOOST_UBLAS_INLINE stride1(const matrix_range<M> & m)470 int stride1( const matrix_range<M> &m ) { 471 return stride1( m.data() ) ; 472 } 473 template < typename M > 474 BOOST_UBLAS_INLINE stride1(const matrix_slice<M> & m)475 int stride1( const matrix_slice<M> &m ) { 476 return m.stride1() * stride1( m.data() ) ; 477 } 478 template < typename M > 479 BOOST_UBLAS_INLINE stride2(const matrix_range<M> & m)480 int stride2( const matrix_range<M> &m ) { 481 return stride2( m.data() ) ; 482 } 483 template < typename M > 484 BOOST_UBLAS_INLINE stride2(const matrix_slice<M> & m)485 int stride2( const matrix_slice<M> &m ) { 486 return m.stride2() * stride2( m.data() ) ; 487 } 488 489 template < typename MV > 490 BOOST_UBLAS_INLINE data(const MV & mv)491 typename MV::array_type::array_type::array_type::const_pointer data( const MV &mv ) { 492 return &mv.data().begin()[0] ; 493 } 494 template < typename MV > 495 BOOST_UBLAS_INLINE data_const(const MV & mv)496 typename MV::array_type::array_type::const_pointer data_const( const MV &mv ) { 497 return &mv.data().begin()[0] ; 498 } 499 template < typename MV > 500 BOOST_UBLAS_INLINE data(MV & mv)501 typename MV::array_type::pointer data( MV &mv ) { 502 return &mv.data().begin()[0] ; 503 } 504 505 506 template < typename V > 507 BOOST_UBLAS_INLINE data(const vector_reference<V> & v)508 typename V::array_type::array_type::const_pointer data( const vector_reference<V> &v ) { 509 return data( v.expression () ) ; 510 } 511 template < typename V > 512 BOOST_UBLAS_INLINE data_const(const vector_reference<V> & v)513 typename V::array_type::array_type::const_pointer data_const( const vector_reference<V> &v ) { 514 return data_const( v.expression () ) ; 515 } 516 template < typename V > 517 BOOST_UBLAS_INLINE data(vector_reference<V> & v)518 typename V::array_type::pointer data( vector_reference<V> &v ) { 519 return data( v.expression () ) ; 520 } 521 522 template < typename T, std::size_t N > 523 BOOST_UBLAS_INLINE data(const c_vector<T,N> & v)524 typename c_vector<T, N>::array_type::array_type::const_pointer data( const c_vector<T, N> &v ) { 525 return v.data() ; 526 } 527 template < typename T, std::size_t N > 528 BOOST_UBLAS_INLINE data_const(const c_vector<T,N> & v)529 typename c_vector<T, N>::array_type::array_type::const_pointer data_const( const c_vector<T, N> &v ) { 530 return v.data() ; 531 } 532 template < typename T, std::size_t N > 533 BOOST_UBLAS_INLINE data(c_vector<T,N> & v)534 typename c_vector<T, N>::pointer data( c_vector<T, N> &v ) { 535 return v.data() ; 536 } 537 538 template < typename V > 539 BOOST_UBLAS_INLINE data(const vector_range<V> & v)540 typename V::array_type::array_type::const_pointer data( const vector_range<V> &v ) { 541 return data( v.data() ) + v.start() * stride (v.data() ) ; 542 } 543 template < typename V > 544 BOOST_UBLAS_INLINE data(const vector_slice<V> & v)545 typename V::array_type::array_type::const_pointer data( const vector_slice<V> &v ) { 546 return data( v.data() ) + v.start() * stride (v.data() ) ; 547 } 548 template < typename V > 549 BOOST_UBLAS_INLINE data_const(const vector_range<V> & v)550 typename V::array_type::array_type::const_pointer data_const( const vector_range<V> &v ) { 551 return data_const( v.data() ) + v.start() * stride (v.data() ) ; 552 } 553 template < typename V > 554 BOOST_UBLAS_INLINE data_const(const vector_slice<V> & v)555 typename V::array_type::const_pointer data_const( const vector_slice<V> &v ) { 556 return data_const( v.data() ) + v.start() * stride (v.data() ) ; 557 } 558 template < typename V > 559 BOOST_UBLAS_INLINE data(vector_range<V> & v)560 typename V::array_type::pointer data( vector_range<V> &v ) { 561 return data( v.data() ) + v.start() * stride (v.data() ) ; 562 } 563 template < typename V > 564 BOOST_UBLAS_INLINE data(vector_slice<V> & v)565 typename V::array_type::pointer data( vector_slice<V> &v ) { 566 return data( v.data() ) + v.start() * stride (v.data() ) ; 567 } 568 569 template < typename M > 570 BOOST_UBLAS_INLINE data(const matrix_reference<M> & m)571 typename M::array_type::const_pointer data( const matrix_reference<M> &m ) { 572 return data( m.expression () ) ; 573 } 574 template < typename M > 575 BOOST_UBLAS_INLINE data_const(const matrix_reference<M> & m)576 typename M::array_type::const_pointer data_const( const matrix_reference<M> &m ) { 577 return data_const( m.expression () ) ; 578 } 579 template < typename M > 580 BOOST_UBLAS_INLINE data(matrix_reference<M> & m)581 typename M::array_type::pointer data( matrix_reference<M> &m ) { 582 return data( m.expression () ) ; 583 } 584 585 template < typename T, std::size_t M, std::size_t N > 586 BOOST_UBLAS_INLINE data(const c_matrix<T,M,N> & m)587 typename c_matrix<T, M, N>::array_type::const_pointer data( const c_matrix<T, M, N> &m ) { 588 return m.data() ; 589 } 590 template < typename T, std::size_t M, std::size_t N > 591 BOOST_UBLAS_INLINE data_const(const c_matrix<T,M,N> & m)592 typename c_matrix<T, M, N>::array_type::const_pointer data_const( const c_matrix<T, M, N> &m ) { 593 return m.data() ; 594 } 595 template < typename T, std::size_t M, std::size_t N > 596 BOOST_UBLAS_INLINE data(c_matrix<T,M,N> & m)597 typename c_matrix<T, M, N>::pointer data( c_matrix<T, M, N> &m ) { 598 return m.data() ; 599 } 600 601 template < typename M > 602 BOOST_UBLAS_INLINE data(const matrix_row<M> & v)603 typename M::array_type::const_pointer data( const matrix_row<M> &v ) { 604 return data( v.data() ) + v.index() * stride1( v.data() ) ; 605 } 606 template < typename M > 607 BOOST_UBLAS_INLINE data(const matrix_column<M> & v)608 typename M::array_type::const_pointer data( const matrix_column<M> &v ) { 609 return data( v.data() ) + v.index() * stride2( v.data() ) ; 610 } 611 template < typename M > 612 BOOST_UBLAS_INLINE data_const(const matrix_row<M> & v)613 typename M::array_type::const_pointer data_const( const matrix_row<M> &v ) { 614 return data_const( v.data() ) + v.index() * stride1( v.data() ) ; 615 } 616 template < typename M > 617 BOOST_UBLAS_INLINE data_const(const matrix_column<M> & v)618 typename M::array_type::const_pointer data_const( const matrix_column<M> &v ) { 619 return data_const( v.data() ) + v.index() * stride2( v.data() ) ; 620 } 621 template < typename M > 622 BOOST_UBLAS_INLINE data(matrix_row<M> & v)623 typename M::array_type::pointer data( matrix_row<M> &v ) { 624 return data( v.data() ) + v.index() * stride1( v.data() ) ; 625 } 626 template < typename M > 627 BOOST_UBLAS_INLINE data(matrix_column<M> & v)628 typename M::array_type::pointer data( matrix_column<M> &v ) { 629 return data( v.data() ) + v.index() * stride2( v.data() ) ; 630 } 631 632 template < typename M > 633 BOOST_UBLAS_INLINE data(const matrix_range<M> & m)634 typename M::array_type::const_pointer data( const matrix_range<M> &m ) { 635 return data( m.data() ) + m.start1() * stride1( m.data () ) + m.start2() * stride2( m.data () ) ; 636 } 637 template < typename M > 638 BOOST_UBLAS_INLINE data(const matrix_slice<M> & m)639 typename M::array_type::const_pointer data( const matrix_slice<M> &m ) { 640 return data( m.data() ) + m.start1() * stride1( m.data () ) + m.start2() * stride2( m.data () ) ; 641 } 642 template < typename M > 643 BOOST_UBLAS_INLINE data_const(const matrix_range<M> & m)644 typename M::array_type::const_pointer data_const( const matrix_range<M> &m ) { 645 return data_const( m.data() ) + m.start1() * stride1( m.data () ) + m.start2() * stride2( m.data () ) ; 646 } 647 template < typename M > 648 BOOST_UBLAS_INLINE data_const(const matrix_slice<M> & m)649 typename M::array_type::const_pointer data_const( const matrix_slice<M> &m ) { 650 return data_const( m.data() ) + m.start1() * stride1( m.data () ) + m.start2() * stride2( m.data () ) ; 651 } 652 template < typename M > 653 BOOST_UBLAS_INLINE data(matrix_range<M> & m)654 typename M::array_type::pointer data( matrix_range<M> &m ) { 655 return data( m.data() ) + m.start1() * stride1( m.data () ) + m.start2() * stride2( m.data () ) ; 656 } 657 template < typename M > 658 BOOST_UBLAS_INLINE data(matrix_slice<M> & m)659 typename M::array_type::pointer data( matrix_slice<M> &m ) { 660 return data( m.data() ) + m.start1() * stride1( m.data () ) + m.start2() * stride2( m.data () ) ; 661 } 662 663 664 template < typename MV > 665 BOOST_UBLAS_INLINE base(const MV & mv)666 typename MV::array_type::const_pointer base( const MV &mv ) { 667 return &mv.data().begin()[0] ; 668 } 669 template < typename MV > 670 BOOST_UBLAS_INLINE base_const(const MV & mv)671 typename MV::array_type::const_pointer base_const( const MV &mv ) { 672 return &mv.data().begin()[0] ; 673 } 674 template < typename MV > 675 BOOST_UBLAS_INLINE base(MV & mv)676 typename MV::array_type::pointer base( MV &mv ) { 677 return &mv.data().begin()[0] ; 678 } 679 680 template < typename V > 681 BOOST_UBLAS_INLINE base(const vector_reference<V> & v)682 typename V::array_type::const_pointer base( const vector_reference<V> &v ) { 683 return base( v.expression () ) ; 684 } 685 template < typename V > 686 BOOST_UBLAS_INLINE base_const(const vector_reference<V> & v)687 typename V::array_type::const_pointer base_const( const vector_reference<V> &v ) { 688 return base_const( v.expression () ) ; 689 } 690 template < typename V > 691 BOOST_UBLAS_INLINE base(vector_reference<V> & v)692 typename V::array_type::pointer base( vector_reference<V> &v ) { 693 return base( v.expression () ) ; 694 } 695 696 template < typename T, std::size_t N > 697 BOOST_UBLAS_INLINE base(const c_vector<T,N> & v)698 typename c_vector<T, N>::array_type::const_pointer base( const c_vector<T, N> &v ) { 699 return v.data() ; 700 } 701 template < typename T, std::size_t N > 702 BOOST_UBLAS_INLINE base_const(const c_vector<T,N> & v)703 typename c_vector<T, N>::array_type::const_pointer base_const( const c_vector<T, N> &v ) { 704 return v.data() ; 705 } 706 template < typename T, std::size_t N > 707 BOOST_UBLAS_INLINE base(c_vector<T,N> & v)708 typename c_vector<T, N>::pointer base( c_vector<T, N> &v ) { 709 return v.data() ; 710 } 711 712 template < typename V > 713 BOOST_UBLAS_INLINE base(const vector_range<V> & v)714 typename V::array_type::const_pointer base( const vector_range<V> &v ) { 715 return base( v.data() ) ; 716 } 717 template < typename V > 718 BOOST_UBLAS_INLINE base(const vector_slice<V> & v)719 typename V::array_type::const_pointer base( const vector_slice<V> &v ) { 720 return base( v.data() ) ; 721 } 722 template < typename V > 723 BOOST_UBLAS_INLINE base_const(const vector_range<V> & v)724 typename V::array_type::const_pointer base_const( const vector_range<V> &v ) { 725 return base_const( v.data() ) ; 726 } 727 template < typename V > 728 BOOST_UBLAS_INLINE base_const(const vector_slice<V> & v)729 typename V::array_type::const_pointer base_const( const vector_slice<V> &v ) { 730 return base_const( v.data() ) ; 731 } 732 template < typename V > 733 BOOST_UBLAS_INLINE base(vector_range<V> & v)734 typename V::array_type::pointer base( vector_range<V> &v ) { 735 return base( v.data() ) ; 736 } 737 template < typename V > 738 BOOST_UBLAS_INLINE base(vector_slice<V> & v)739 typename V::array_type::pointer base( vector_slice<V> &v ) { 740 return base( v.data() ) ; 741 } 742 743 template < typename M > 744 BOOST_UBLAS_INLINE base(const matrix_reference<M> & m)745 typename M::array_type::const_pointer base( const matrix_reference<M> &m ) { 746 return base( m.expression () ) ; 747 } 748 template < typename M > 749 BOOST_UBLAS_INLINE base_const(const matrix_reference<M> & m)750 typename M::array_type::const_pointer base_const( const matrix_reference<M> &m ) { 751 return base_const( m.expression () ) ; 752 } 753 template < typename M > 754 BOOST_UBLAS_INLINE base(matrix_reference<M> & m)755 typename M::array_type::pointer base( matrix_reference<M> &m ) { 756 return base( m.expression () ) ; 757 } 758 759 template < typename T, std::size_t M, std::size_t N > 760 BOOST_UBLAS_INLINE base(const c_matrix<T,M,N> & m)761 typename c_matrix<T, M, N>::array_type::const_pointer base( const c_matrix<T, M, N> &m ) { 762 return m.data() ; 763 } 764 template < typename T, std::size_t M, std::size_t N > 765 BOOST_UBLAS_INLINE base_const(const c_matrix<T,M,N> & m)766 typename c_matrix<T, M, N>::array_type::const_pointer base_const( const c_matrix<T, M, N> &m ) { 767 return m.data() ; 768 } 769 template < typename T, std::size_t M, std::size_t N > 770 BOOST_UBLAS_INLINE base(c_matrix<T,M,N> & m)771 typename c_matrix<T, M, N>::pointer base( c_matrix<T, M, N> &m ) { 772 return m.data() ; 773 } 774 775 template < typename M > 776 BOOST_UBLAS_INLINE base(const matrix_row<M> & v)777 typename M::array_type::const_pointer base( const matrix_row<M> &v ) { 778 return base( v.data() ) ; 779 } 780 template < typename M > 781 BOOST_UBLAS_INLINE base(const matrix_column<M> & v)782 typename M::array_type::const_pointer base( const matrix_column<M> &v ) { 783 return base( v.data() ) ; 784 } 785 template < typename M > 786 BOOST_UBLAS_INLINE base_const(const matrix_row<M> & v)787 typename M::array_type::const_pointer base_const( const matrix_row<M> &v ) { 788 return base_const( v.data() ) ; 789 } 790 template < typename M > 791 BOOST_UBLAS_INLINE base_const(const matrix_column<M> & v)792 typename M::array_type::const_pointer base_const( const matrix_column<M> &v ) { 793 return base_const( v.data() ) ; 794 } 795 template < typename M > 796 BOOST_UBLAS_INLINE base(matrix_row<M> & v)797 typename M::array_type::pointer base( matrix_row<M> &v ) { 798 return base( v.data() ) ; 799 } 800 template < typename M > 801 BOOST_UBLAS_INLINE base(matrix_column<M> & v)802 typename M::array_type::pointer base( matrix_column<M> &v ) { 803 return base( v.data() ) ; 804 } 805 806 template < typename M > 807 BOOST_UBLAS_INLINE base(const matrix_range<M> & m)808 typename M::array_type::const_pointer base( const matrix_range<M> &m ) { 809 return base( m.data() ) ; 810 } 811 template < typename M > 812 BOOST_UBLAS_INLINE base(const matrix_slice<M> & m)813 typename M::array_type::const_pointer base( const matrix_slice<M> &m ) { 814 return base( m.data() ) ; 815 } 816 template < typename M > 817 BOOST_UBLAS_INLINE base_const(const matrix_range<M> & m)818 typename M::array_type::const_pointer base_const( const matrix_range<M> &m ) { 819 return base_const( m.data() ) ; 820 } 821 template < typename M > 822 BOOST_UBLAS_INLINE base_const(const matrix_slice<M> & m)823 typename M::array_type::const_pointer base_const( const matrix_slice<M> &m ) { 824 return base_const( m.data() ) ; 825 } 826 template < typename M > 827 BOOST_UBLAS_INLINE base(matrix_range<M> & m)828 typename M::array_type::pointer base( matrix_range<M> &m ) { 829 return base( m.data() ) ; 830 } 831 template < typename M > 832 BOOST_UBLAS_INLINE base(matrix_slice<M> & m)833 typename M::array_type::pointer base( matrix_slice<M> &m ) { 834 return base( m.data() ) ; 835 } 836 837 template < typename MV > 838 BOOST_UBLAS_INLINE start(const MV & mv)839 typename MV::size_type start( const MV &mv ) { 840 return 0 ; 841 } 842 843 template < typename V > 844 BOOST_UBLAS_INLINE start(const vector_range<V> & v)845 typename V::size_type start( const vector_range<V> &v ) { 846 return v.start() * stride (v.data() ) ; 847 } 848 template < typename V > 849 BOOST_UBLAS_INLINE start(const vector_slice<V> & v)850 typename V::size_type start( const vector_slice<V> &v ) { 851 return v.start() * stride (v.data() ) ; 852 } 853 854 template < typename M > 855 BOOST_UBLAS_INLINE start(const matrix_row<M> & v)856 typename M::size_type start( const matrix_row<M> &v ) { 857 return v.index() * stride1( v.data() ) ; 858 } 859 template < typename M > 860 BOOST_UBLAS_INLINE start(const matrix_column<M> & v)861 typename M::size_type start( const matrix_column<M> &v ) { 862 return v.index() * stride2( v.data() ) ; 863 } 864 865 template < typename M > 866 BOOST_UBLAS_INLINE start(const matrix_range<M> & m)867 typename M::size_type start( const matrix_range<M> &m ) { 868 return m.start1() * stride1( m.data () ) + m.start2() * stride2( m.data () ) ; 869 } 870 template < typename M > 871 BOOST_UBLAS_INLINE start(const matrix_slice<M> & m)872 typename M::size_type start( const matrix_slice<M> &m ) { 873 return m.start1() * stride1( m.data () ) + m.start2() * stride2( m.data () ) ; 874 } 875 876 }}}} 877 878 #endif 879