00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef SELDON_FILE_VECTOR_VECTOR_3_CXX
00022
00023
00024 #include "Vector3.hxx"
00025
00026
00027 namespace Seldon
00028 {
00029
00030
00032
00034
00035
00036
00037
00038
00039
00040
00042
00045 template <class T, class Allocator0, class Allocator1, class Allocator2>
00046 Vector3<T, Allocator0, Allocator1, Allocator2>::Vector3()
00047 {
00048 }
00049
00050
00052
00056 template <class T, class Allocator0, class Allocator1, class Allocator2>
00057 Vector3<T, Allocator0, Allocator1, Allocator2>::Vector3(int length)
00058 {
00059 data_.Reallocate(length);
00060 }
00061
00062
00064
00070 template <class T, class Allocator0, class Allocator1, class Allocator2>
00071 Vector3<T, Allocator0, Allocator1, Allocator2>
00072 ::Vector3(Vector<int>& length)
00073 {
00074 data_.Clear();
00075 int n, m = length.GetSize();
00076 data_.Reallocate(m);
00077 for (int i = 0; i < m; i++)
00078 {
00079 n = length(i);
00080 data_(i).Reallocate(n);
00081 }
00082 }
00083
00084
00086
00092 template <class T, class Allocator0, class Allocator1, class Allocator2>
00093 template <class Allocator>
00094 Vector3<T, Allocator0, Allocator1, Allocator2>
00095 ::Vector3(Vector<Vector<int>, Vect_Full, Allocator>& length)
00096 {
00097 data_.Clear();
00098 int n, m = length.GetSize();
00099 data_.Reallocate(m);
00100 for (int i = 0; i < m; i++)
00101 {
00102 n = length(i).GetSize();
00103 data_(i).Reallocate(n);
00104 for (int j = 0; j < n; j++)
00105 data_(i)(j).Reallocate(length(i)(j));
00106 }
00107 }
00108
00109
00110
00111
00112
00113
00114
00116
00119 template <class T, class Allocator0, class Allocator1, class Allocator2>
00120 Vector3<T, Allocator0, Allocator1, Allocator2>::~Vector3()
00121 {
00122 }
00123
00124
00125
00126
00127
00128
00129
00131
00134 template <class T, class Allocator0, class Allocator1, class Allocator2>
00135 int Vector3<T, Allocator0, Allocator1, Allocator2>::GetLength() const
00136 {
00137 return data_.GetLength();
00138 }
00139
00140
00142
00145 template <class T, class Allocator0, class Allocator1, class Allocator2>
00146 int Vector3<T, Allocator0, Allocator1, Allocator2>::GetSize() const
00147 {
00148 return data_.GetSize();
00149 }
00150
00151
00153
00157 template <class T, class Allocator0, class Allocator1, class Allocator2>
00158 int Vector3<T, Allocator0, Allocator1, Allocator2>::GetLength(int i) const
00159 {
00160 return data_(i).GetLength();
00161 }
00162
00163
00165
00169 template <class T, class Allocator0, class Allocator1, class Allocator2>
00170 int Vector3<T, Allocator0, Allocator1, Allocator2>::GetSize(int i) const
00171 {
00172 return data_(i).GetSize();
00173 }
00174
00175
00177
00182 template <class T, class Allocator0, class Allocator1, class Allocator2>
00183 int Vector3<T, Allocator0, Allocator1, Allocator2>
00184 ::GetLength(int i, int j) const
00185 {
00186 return data_(i)(j).GetLength();
00187 }
00188
00189
00191
00196 template <class T, class Allocator0, class Allocator1, class Allocator2>
00197 int Vector3<T, Allocator0, Allocator1, Allocator2>
00198 ::GetSize(int i, int j) const
00199 {
00200 return data_(i)(j).GetSize();
00201 }
00202
00203
00205
00208 template <class T, class Allocator0, class Allocator1, class Allocator2>
00209 int Vector3<T, Allocator0, Allocator1, Allocator2>::GetNelement() const
00210 {
00211 int total = 0;
00212 for (int i = 0; i < GetLength(); i++)
00213 for (int j = 0; j < GetLength(i); j++ )
00214 total += GetLength(i, j);
00215 return total;
00216 }
00217
00218
00220
00227 template <class T, class Allocator0, class Allocator1, class Allocator2>
00228 int Vector3<T, Allocator0, Allocator1, Allocator2>
00229 ::GetNelement(int beg, int end) const
00230 {
00231 if (beg > end)
00232 throw WrongArgument("Vector3::GetNelement(int beg, int end)",
00233 "The lower bound of the range of inner vectors "
00234 "of vectors, [" + to_str(beg) + ", " + to_str(end)
00235 + "[, is strictly greater than its upper bound.");
00236 if (beg < 0 || end > GetLength())
00237 throw WrongArgument("Vector3::GetNelement(int beg, int end)",
00238 "The inner-vector of vectors indexes should be in "
00239 "[0," + to_str(GetLength()) + "] but ["
00240 + to_str(beg)
00241 + ", " + to_str(end) + "[ was provided.");
00242
00243 int total = 0;
00244 for (int i = beg; i < end; i++)
00245 for (int j = 0; j < GetLength(i); j++ )
00246 total += GetLength(i, j);
00247 return total;
00248 }
00249
00250
00252
00266 template <class T, class Allocator0, class Allocator1, class Allocator2>
00267 int Vector3<T, Allocator0, Allocator1, Allocator2>
00268 ::GetNelement(int beg0, int end0, int beg1, int end1) const
00269 {
00270 if (beg0 > end0)
00271 throw WrongArgument("Vector3:::GetNelement(int beg0, int end0, "
00272 "int beg1, int end1)",
00273 "The lower bound of the range of inner vectors "
00274 "of vectors, [" + to_str(beg0) + ", " + to_str(end0)
00275 + "[, is strictly greater than its upper bound.");
00276 if (beg1 > end1)
00277 throw WrongArgument("Vector3:::GetNelement(int beg0, int end0, "
00278 "int beg1, int end1)",
00279 "The lower bound of the range of "
00280 "of vectors, [" + to_str(beg1) + ", " + to_str(end1)
00281 + "[, is strictly greater than its upper bound.");
00282 if (beg0 < 0 || end0 > GetLength())
00283 throw WrongArgument("Vector3:::GetNelement(int beg0, int end0, "
00284 "int beg1, int end1)",
00285 "The inner-vector of vectors indexes should be in "
00286 "[0," + to_str(GetLength()) + "] but ["
00287 + to_str(beg0)
00288 + ", " + to_str(end0) + "[ was provided.");
00289
00290 int total = 0;
00291 for (int i = beg0; i < end0; i++)
00292 {
00293 if (beg1 < 0 || end1 > GetLength(i))
00294 throw WrongArgument("Vector3:::GetNelement(int beg0, int end0, "
00295 "int beg1, int end1)",
00296 "For the inner vector of vectors "
00297 + to_str(i) + ", the vectors indexes should be "
00298 "in [0," + to_str(GetLength(i)) + "] but ["
00299 + to_str(beg1)
00300 + ", " + to_str(end1) + "[ was provided.");
00301 for (int j = beg1; j < end1; j++)
00302 total += GetLength(i, j);
00303 }
00304 return total;
00305 }
00306
00307
00309
00314 template <class T, class Allocator0, class Allocator1, class Allocator2>
00315 Vector<int> Vector3<T, Allocator0, Allocator1, Allocator2>
00316 ::GetShape(int i) const
00317 {
00318 Vector<int> shape(GetLength(i));
00319 for (int j = 0; j < GetLength(i); j++)
00320 shape(j) = GetLength(i, j);
00321 return shape;
00322 }
00323
00324
00326
00331 template <class T, class Allocator0, class Allocator1, class Allocator2>
00332 void Vector3<T, Allocator0, Allocator1, Allocator2>
00333 ::GetShape(int i, Vector<int>& shape) const
00334 {
00335 shape.Reallocate(GetLength(i));
00336 for (int j = 0; j < GetLength(i); j++)
00337 shape(j) = GetLength(i, j);
00338 }
00339
00340
00342
00345 template <class T, class Allocator0, class Allocator1, class Allocator2>
00346 void Vector3<T, Allocator0, Allocator1, Allocator2>::Reallocate(int N)
00347 {
00348 data_.Reallocate(N);
00349 }
00350
00351
00353
00357 template <class T, class Allocator0, class Allocator1, class Allocator2>
00358 void Vector3<T, Allocator0, Allocator1, Allocator2>
00359 ::Reallocate(int i, int N)
00360 {
00361 data_(i).Reallocate(N);
00362 }
00363
00364
00366
00371 template <class T, class Allocator0, class Allocator1, class Allocator2>
00372 void Vector3<T, Allocator0, Allocator1, Allocator2>
00373 ::Reallocate(int i, int j, int N)
00374 {
00375 data_(i)(j).Reallocate(N);
00376 }
00377
00378
00380
00384 template <class T, class Allocator0, class Allocator1, class Allocator2>
00385 template <class Td, class Allocatord>
00386 void Vector3<T, Allocator0, Allocator1, Allocator2>
00387 ::Flatten(Vector<Td, VectFull, Allocatord>& data) const
00388 {
00389 data.Reallocate(GetNelement());
00390 int i, j, k, n(0);
00391 for (i = 0; i < GetLength(); i++)
00392 for (j = 0; j < GetLength(i); j++)
00393 for (k = 0; k < GetLength(i, j); k++)
00394 data(n++) = data_(i)(j)(k);
00395 }
00396
00397
00399
00407 template <class T, class Allocator0, class Allocator1, class Allocator2>
00408 template <class Td, class Allocatord>
00409 void Vector3<T, Allocator0, Allocator1, Allocator2>
00410 ::Flatten(int beg, int end, Vector<Td, VectFull, Allocatord>& data) const
00411 {
00412 if (beg > end)
00413 throw WrongArgument("Vector3:::Flatten(int beg, int end, Vector& data)",
00414 "The lower bound of the range of inner vectors "
00415 "of vectors, [" + to_str(beg) + ", " + to_str(end)
00416 + "[, is strictly greater than its upper bound.");
00417 if (beg < 0 || end > GetLength())
00418 throw WrongArgument("Vector3:::Flatten(int beg, int end, Vector& data)",
00419 "The inner-vector of vectors indexes should be in "
00420 "[0," + to_str(GetLength()) + "] but ["
00421 + to_str(beg)
00422 + ", " + to_str(end) + "[ was provided.");
00423
00424 data.Reallocate(GetNelement(beg, end));
00425 int i, j, k, n(0);
00426 for (i = beg; i < end; i++)
00427 for (j = 0; j < GetLength(i); j++)
00428 for (k = 0; k < GetLength(i, j); k++)
00429 data(n++) = data_(i)(j)(k);
00430 }
00431
00432
00450 template <class T, class Allocator0, class Allocator1, class Allocator2>
00451 template <class Td, class Allocatord>
00452 void Vector3<T, Allocator0, Allocator1, Allocator2>
00453 ::Flatten(int beg0, int end0, int beg1, int end1,
00454 Vector<Td, VectFull, Allocatord>& data) const
00455 {
00456 if (beg0 > end0)
00457 throw WrongArgument("Vector3:::Flatten(int beg0, int end0, int beg1, "
00458 "int end1, Vector& data)",
00459 "The lower bound of the range of inner vectors "
00460 "of vectors, [" + to_str(beg0) + ", " + to_str(end0)
00461 + "[, is strictly greater than its upper bound.");
00462 if (beg1 > end1)
00463 throw WrongArgument("Vector3:::Flatten(int beg0, int end0, int beg1, "
00464 "int end1, Vector& data)",
00465 "The lower bound of the range of "
00466 "of vectors, [" + to_str(beg1) + ", " + to_str(end1)
00467 + "[, is strictly greater than its upper bound.");
00468 if (beg0 < 0 || end0 > GetLength())
00469 throw WrongArgument("Vector3:::Flatten(int beg0, int end0, int beg1, "
00470 "int end1, Vector& data)",
00471 "The inner-vector of vectors indexes should be in "
00472 "[0," + to_str(GetLength()) + "] but ["
00473 + to_str(beg0)
00474 + ", " + to_str(end0) + "[ was provided.");
00475
00476 data.Reallocate(GetNelement(beg0, end0, beg1, end1));
00477 int i, j, k, n(0);
00478 for (i = beg0; i < end0; i++)
00479 {
00480 if (beg1 < 0 || end1 > GetLength(i))
00481 throw WrongArgument("Vector3:::Flatten(int beg0, int end0, int beg1, "
00482 "int end1, Vector& data)",
00483 "For the inner vector of vectors "
00484 + to_str(i) + ", the vectors indexes should be "
00485 "in [0," + to_str(GetLength(i)) + "] but ["
00486 + to_str(beg1)
00487 + ", " + to_str(end1) + "[ was provided.");
00488 for (j = beg1; j < end1; j++)
00489 for (k = 0; k < GetLength(i, j); k++)
00490 data(n++) = data_(i)(j)(k);
00491 }
00492 }
00493
00494
00496
00501 template <class T, class Allocator0, class Allocator1, class Allocator2>
00502 void Vector3<T, Allocator0,
00503 Allocator1, Allocator2>::PushBack(int i, int j, const T& x)
00504 {
00505 data_(i)(j).PushBack(x);
00506 }
00507
00508
00510
00514 template <class T, class Allocator0, class Allocator1, class Allocator2>
00515 void Vector3<T, Allocator0, Allocator1, Allocator2>::
00516 PushBack(int i, const Vector<T, Vect_Full, Allocator0>& X)
00517 {
00518 data_(i).PushBack(X);
00519 }
00520
00521
00523
00526 template <class T, class Allocator0, class Allocator1, class Allocator2>
00527 void Vector3<T, Allocator0, Allocator1, Allocator2>
00528 ::PushBack(const Vector<Vector<T, Vect_Full, Allocator0>,
00529 Vect_Full, Allocator1>& X)
00530 {
00531 data_.PushBack(X);
00532 }
00533
00534
00536
00540 template <class T, class Allocator0, class Allocator1, class Allocator2>
00541 void Vector3<T, Allocator0, Allocator1, Allocator2>
00542 ::PushBack(const Vector<Vector<Vector<T, Vect_Full, Allocator0>,
00543 Vect_Full, Allocator1>, Vect_Full, Allocator2>& X)
00544 {
00545 for (int i = 0; i < X.GetLength(); i++)
00546 data_.PushBack(X(i));
00547 }
00548
00549
00551
00555 template <class T, class Allocator0, class Allocator1, class Allocator2>
00556 void Vector3<T, Allocator0, Allocator1, Allocator2>
00557 ::PushBack(const Vector3<T, Allocator0, Allocator1, Allocator2>& X)
00558 {
00559 for (int i = 0; i < X.GetLength(); i++)
00560 data_.PushBack(X.GetVector());
00561 }
00562
00563
00565 template <class T, class Allocator0, class Allocator1, class Allocator2>
00566 void Vector3<T, Allocator0, Allocator1, Allocator2>::Clear()
00567 {
00568 data_.Clear();
00569 }
00570
00571
00573
00576 template <class T, class Allocator0, class Allocator1, class Allocator2>
00577 void Vector3<T, Allocator0,
00578 Allocator1, Allocator2>::Clear(int i)
00579 {
00580 data_(i).Clear();
00581 }
00582
00583
00585
00589 template <class T, class Allocator0, class Allocator1, class Allocator2>
00590 void Vector3<T, Allocator0, Allocator1, Allocator2>::Clear(int i, int j)
00591 {
00592 data_(i)(j).Clear();
00593 }
00594
00595
00597
00600 template <class T, class Allocator0, class Allocator1, class Allocator2>
00601 void Vector3<T, Allocator0, Allocator1, Allocator2>::Fill(const T& x)
00602 {
00603 for (int i = 0; i < data_.GetSize(); i++)
00604 for (int j = 0; j < data_(i).GetSize(); j++)
00605 data_(i)(j).Fill(x);
00606 }
00607
00608
00610
00613 template <class T, class Allocator0, class Allocator1, class Allocator2>
00614 Vector<Vector<Vector<T, Vect_Full, Allocator0>, Vect_Full, Allocator1>,
00615 Vect_Full, Allocator2>&
00616 Vector3<T, Allocator0, Allocator1, Allocator2>::GetVector()
00617 {
00618 return data_;
00619 }
00620
00621
00623
00626 template <class T, class Allocator0, class Allocator1, class Allocator2>
00627 const Vector<Vector<Vector<T, Vect_Full, Allocator0>,
00628 Vect_Full, Allocator1>, Vect_Full, Allocator2>&
00629 Vector3<T, Allocator0, Allocator1, Allocator2>::GetVector() const
00630 {
00631 return data_;
00632 }
00633
00634
00636
00640 template <class T, class Allocator0, class Allocator1, class Allocator2>
00641 Vector<Vector<T, Vect_Full, Allocator0>, VectFull, Allocator1>&
00642 Vector3<T, Allocator0, Allocator1, Allocator2>::GetVector(int i)
00643 {
00644 return data_(i);
00645 }
00646
00647
00649
00653 template <class T, class Allocator0, class Allocator1, class Allocator2>
00654 const Vector<Vector<T, Vect_Full, Allocator0>, VectFull, Allocator1>&
00655 Vector3<T, Allocator0, Allocator1, Allocator2>::GetVector(int i) const
00656 {
00657 return data_(i);
00658 }
00659
00660
00662
00667 template <class T, class Allocator0, class Allocator1, class Allocator2>
00668 Vector<T, Vect_Full, Allocator0>&
00669 Vector3<T, Allocator0, Allocator1, Allocator2>::GetVector(int i, int j)
00670 {
00671 return data_(i)(j);
00672 }
00673
00674
00676
00681 template <class T, class Allocator0, class Allocator1, class Allocator2>
00682 const Vector<T, Vect_Full, Allocator0>&
00683 Vector3<T, Allocator0, Allocator1, Allocator2>::GetVector(int i, int j)
00684 const
00685 {
00686 return data_(i)(j);
00687 }
00688
00689
00690
00691
00692
00693
00694
00696
00700 template <class T, class Allocator0, class Allocator1, class Allocator2>
00701 const Vector<Vector<T, Vect_Full, Allocator0>, VectFull, Allocator1>&
00702 Vector3<T, Allocator0,
00703 Allocator1, Allocator2>::operator() (int i) const
00704 {
00705 return data_(i);
00706 }
00707
00708
00710
00714 template <class T, class Allocator0, class Allocator1, class Allocator2>
00715 Vector<Vector<T, Vect_Full, Allocator0>, VectFull, Allocator1>&
00716 Vector3<T, Allocator0, Allocator1, Allocator2>::operator() (int i)
00717 {
00718 return data_(i);
00719 }
00720
00721
00723
00728 template <class T, class Allocator0, class Allocator1, class Allocator2>
00729 const Vector<T, Vect_Full, Allocator0>&
00730 Vector3<T, Allocator0,
00731 Allocator1, Allocator2>::operator() (int i, int j) const
00732 {
00733 return data_(i)(j);
00734 }
00735
00736
00738
00743 template <class T, class Allocator0, class Allocator1, class Allocator2>
00744 Vector<T, Vect_Full, Allocator0>&
00745 Vector3<T, Allocator0, Allocator1, Allocator2>::operator() (int i, int j)
00746 {
00747 return data_(i)(j);
00748 }
00749
00750
00752
00758 template <class T, class Allocator0, class Allocator1, class Allocator2>
00759 typename Vector3<T, Allocator0, Allocator1, Allocator2>::const_reference
00760 Vector3<T, Allocator0,
00761 Allocator1, Allocator2>::operator() (int i, int j, int k) const
00762 {
00763 return data_(i)(j)(k);
00764 }
00765
00766
00768
00774 template <class T, class Allocator0, class Allocator1, class Allocator2>
00775 typename Vector3<T, Allocator0, Allocator1, Allocator2>::reference
00776 Vector3<T, Allocator0, Allocator1, Allocator2>::operator()
00777 (int i, int j, int k)
00778 {
00779 return data_(i)(j)(k);
00780 }
00781
00782
00783
00784
00785
00786
00787
00789 template <class T, class Allocator0, class Allocator1, class Allocator2>
00790 void Vector3<T, Allocator0, Allocator1, Allocator2>::Print() const
00791 {
00792 for (int i = 0; i < data_.GetSize(); i++)
00793 for(int j = 0; j < data_(i).GetSize(); j++)
00794 {
00795 cout << "Vector " << i << ", " << j << ": ";
00796 data_(i)(j).Print();
00797 }
00798 }
00799
00800
00801
00802
00803
00804
00805
00807
00812 template <class T, class Allocator0, class Allocator1, class Allocator2>
00813 void Vector3<T, Allocator0, Allocator1, Allocator2>
00814 ::Write(string file_name, bool with_size) const
00815 {
00816 ofstream file_stream;
00817 file_stream.open(file_name.c_str());
00818
00819 #ifdef SELDON_CHECK_IO
00820
00821 if (!file_stream.is_open())
00822 throw IOError("Vector3::Write(string file_name, bool with_size)",
00823 string("Unable to open file \"") + file_name + "\".");
00824 #endif
00825
00826 this->Write(file_stream, with_size);
00827
00828 file_stream.close();
00829 }
00830
00831
00833
00838 template <class T, class Allocator0, class Allocator1, class Allocator2>
00839 void Vector3<T, Allocator0, Allocator1, Allocator2>
00840 ::Write(ostream& stream, bool with_size) const
00841 {
00842
00843 #ifdef SELDON_CHECK_IO
00844
00845 if (!stream.good())
00846 throw IOError("Vector3::Write(ostream& stream, bool with_size)",
00847 "The stream is not ready.");
00848 #endif
00849
00850 if (with_size)
00851 {
00852 int m = GetLength();
00853 stream.write(reinterpret_cast<char*>(const_cast<int*>(&m)),
00854 sizeof(int));
00855 }
00856
00857 for (int i = 0; i < GetLength(); i++)
00858 {
00859 if (with_size)
00860 {
00861 int m = GetLength(i);
00862 stream.write(reinterpret_cast<char*>(const_cast<int*>(&m)),
00863 sizeof(int));
00864 }
00865 for (int j = 0; j < GetLength(i); j++)
00866 data_(i)(j).Write(stream, with_size);
00867 }
00868
00869 #ifdef SELDON_CHECK_IO
00870
00871 if (!stream.good())
00872 throw IOError("Vector3::Write(ostream& stream, bool with_size)",
00873 "Output operation failed.");
00874 #endif
00875
00876 }
00877
00878
00880
00887 template <class T, class Allocator0, class Allocator1, class Allocator2>
00888 void Vector3<T, Allocator0, Allocator1, Allocator2>
00889 ::Read(string file_name, bool with_size)
00890 {
00891 ifstream file_stream;
00892 file_stream.open(file_name.c_str());
00893
00894 #ifdef SELDON_CHECK_IO
00895
00896 if (!file_stream.is_open())
00897 throw IOError("Vector3::Read(string file_name, bool with_size)",
00898 string("Unable to open file \"") + file_name + "\".");
00899 #endif
00900
00901 this->Read(file_stream, with_size);
00902
00903 file_stream.close();
00904 }
00905
00906
00908
00915 template <class T, class Allocator0, class Allocator1, class Allocator2>
00916 void Vector3<T, Allocator0, Allocator1, Allocator2>
00917 ::Read(istream& stream, bool with_size)
00918 {
00919
00920 #ifdef SELDON_CHECK_IO
00921
00922 if (!stream.good())
00923 throw IOError("Vector3::Read(istream& stream, bool with_size)",
00924 "The stream is not ready.");
00925 #endif
00926
00927 if (with_size)
00928 {
00929 int new_size;
00930 stream.read(reinterpret_cast<char*>(&new_size), sizeof(int));
00931 this->Reallocate(new_size);
00932 }
00933
00934 for (int i = 0; i < GetLength(); i++)
00935 {
00936 if (with_size)
00937 {
00938 int new_size;
00939 stream.read(reinterpret_cast<char*>(&new_size), sizeof(int));
00940 this->Reallocate(i, new_size);
00941 }
00942 for (int j = 0; j < GetLength(i); j++)
00943 data_(i)(j).Read(stream, with_size);
00944 }
00945
00946 #ifdef SELDON_CHECK_IO
00947
00948 if (!stream.good())
00949 throw IOError("Vector3::Read(istream& stream, bool with_size)",
00950 "Output operation failed.");
00951 #endif
00952
00953 }
00954
00955
00956 }
00957
00958
00959 #define SELDON_FILE_VECTOR_VECTOR_3_CXX
00960 #endif