| 1 | < | /* | 
| 1 | > | /* | 
| 2 |  | * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved. | 
| 3 |  | * | 
| 4 |  | * The University of Notre Dame grants you ("Licensee") a | 
| 54 |  | #include <math/SquareMatrix3.hpp> | 
| 55 |  |  | 
| 56 |  | namespace oopse { | 
| 57 | < | /** | 
| 58 | < | * @class DataStorage | 
| 59 | < | * @warning do not try to insert element into (or ease element from) private member data | 
| 60 | < | * of DataStorage directly. | 
| 61 | < | * @todo DataStorage may need refactorying. Every std::vector can inherit from the same base class | 
| 62 | < | * which will make it easy to maintain | 
| 63 | < | */ | 
| 64 | < | class DataStorage { | 
| 65 | < | public: | 
| 57 | > | /** | 
| 58 | > | * @class DataStorage | 
| 59 | > | * @warning do not try to insert element into (or ease element from) private member data | 
| 60 | > | * of DataStorage directly. | 
| 61 | > | * @todo DataStorage may need refactorying. Every std::vector can inherit from the same base class | 
| 62 | > | * which will make it easy to maintain | 
| 63 | > | */ | 
| 64 | > | class DataStorage { | 
| 65 | > | public: | 
| 66 |  |  | 
| 67 | < | enum{ | 
| 68 | < | dslPosition = 1, | 
| 69 | < | dslVelocity = 2, | 
| 70 | < | dslAmat = 4, | 
| 71 | < | dslAngularMomentum = 8, | 
| 72 | < | dslElectroFrame = 16, | 
| 73 | < | dslZAngle = 32, | 
| 74 | < | dslForce = 64, | 
| 75 | < | dslTorque = 128 | 
| 76 | < | }; | 
| 67 | > | enum{ | 
| 68 | > | dslPosition = 1, | 
| 69 | > | dslVelocity = 2, | 
| 70 | > | dslAmat = 4, | 
| 71 | > | dslAngularMomentum = 8, | 
| 72 | > | dslElectroFrame = 16, | 
| 73 | > | dslZAngle = 32, | 
| 74 | > | dslForce = 64, | 
| 75 | > | dslTorque = 128 | 
| 76 | > | }; | 
| 77 |  |  | 
| 78 |  |  | 
| 79 | < | DataStorage(); | 
| 80 | < | DataStorage(int size, int storageLayout = 255); | 
| 81 | < | /** return the size of this DataStorage. */ | 
| 82 | < | int getSize(); | 
| 83 | < | /** | 
| 84 | < | * Changes the size of this DataStorage. | 
| 85 | < | * @param size new size of this DataStorage | 
| 86 | < | */ | 
| 87 | < | void resize(int newSize); | 
| 88 | < | /** | 
| 89 | < | * Reallocates memory manually. The main reason for using reserve() is efficiency | 
| 90 | < | * if you know the capacity to which your std::vector must eventually grow, then it is usually more | 
| 91 | < | * efficient to allocate that memory all at once. | 
| 92 | < | */ | 
| 93 | < | void reserve(int size); | 
| 94 | < | /** | 
| 95 | < | * Copies data inside DataStorage class. | 
| 96 | < | * Copy function actually call std::copy for every std::vector in DataStorage class. | 
| 97 | < | * One Precondition of std::copy is that target is not within the range [soruce, soruce + num] | 
| 98 | < | * @param souce | 
| 99 | < | * @param num number of element to be moved | 
| 100 | < | * @param target | 
| 101 | < | */ | 
| 102 | < | void copy(int source, int num, int target); | 
| 103 | < | /** Returns the storage layout  */ | 
| 104 | < | int getStorageLayout(); | 
| 105 | < | /** Sets the storage layout  */ | 
| 106 | < | void setStorageLayout(int layout); | 
| 107 | < | /** Returns the pointer of internal array */ | 
| 108 | < | double *getArrayPointer(int whichArray); | 
| 79 | > | DataStorage(); | 
| 80 | > | DataStorage(int size, int storageLayout = 255); | 
| 81 | > | /** return the size of this DataStorage. */ | 
| 82 | > | int getSize(); | 
| 83 | > | /** | 
| 84 | > | * Changes the size of this DataStorage. | 
| 85 | > | * @param size new size of this DataStorage | 
| 86 | > | */ | 
| 87 | > | void resize(int newSize); | 
| 88 | > | /** | 
| 89 | > | * Reallocates memory manually. The main reason for using reserve() is efficiency | 
| 90 | > | * if you know the capacity to which your std::vector must eventually grow, then it is usually more | 
| 91 | > | * efficient to allocate that memory all at once. | 
| 92 | > | */ | 
| 93 | > | void reserve(int size); | 
| 94 | > | /** | 
| 95 | > | * Copies data inside DataStorage class. | 
| 96 | > | * Copy function actually call std::copy for every std::vector in DataStorage class. | 
| 97 | > | * One Precondition of std::copy is that target is not within the range [soruce, soruce + num] | 
| 98 | > | * @param souce | 
| 99 | > | * @param num number of element to be moved | 
| 100 | > | * @param target | 
| 101 | > | */ | 
| 102 | > | void copy(int source, int num, int target); | 
| 103 | > | /** Returns the storage layout  */ | 
| 104 | > | int getStorageLayout(); | 
| 105 | > | /** Sets the storage layout  */ | 
| 106 | > | void setStorageLayout(int layout); | 
| 107 | > | /** Returns the pointer of internal array */ | 
| 108 | > | double *getArrayPointer(int whichArray); | 
| 109 |  |  | 
| 110 | < | std::vector<Vector3d> position;               /** position array */ | 
| 111 | < | std::vector<Vector3d> velocity;               /** velocity array */ | 
| 112 | < | std::vector<RotMat3x3d> aMat;            /** rotation matrix array */ | 
| 113 | < | std::vector<Vector3d> angularMomentum;/** angular momentum array (body-fixed) */ | 
| 114 | < | std::vector<Mat3x3d> electroFrame;                /** the lab frame unit std::vector array*/ | 
| 115 | < | std::vector<double> zAngle;              /** z -angle array */ | 
| 116 | < | std::vector<Vector3d> force;               /** force array */ | 
| 117 | < | std::vector<Vector3d> torque;               /** torque array */ | 
| 110 | > | std::vector<Vector3d> position;               /** position array */ | 
| 111 | > | std::vector<Vector3d> velocity;               /** velocity array */ | 
| 112 | > | std::vector<RotMat3x3d> aMat;            /** rotation matrix array */ | 
| 113 | > | std::vector<Vector3d> angularMomentum;/** angular momentum array (body-fixed) */ | 
| 114 | > | std::vector<Mat3x3d> electroFrame;                /** the lab frame unit std::vector array*/ | 
| 115 | > | std::vector<double> zAngle;              /** z -angle array */ | 
| 116 | > | std::vector<Vector3d> force;               /** force array */ | 
| 117 | > | std::vector<Vector3d> torque;               /** torque array */ | 
| 118 |  |  | 
| 119 | < | static int getBytesPerStuntDouble(int layout); | 
| 119 | > | static int getBytesPerStuntDouble(int layout); | 
| 120 |  |  | 
| 121 | < | private: | 
| 121 | > | private: | 
| 122 |  |  | 
| 123 | < | double* internalGetArrayPointer(std::vector<Vector3d>& v); | 
| 123 | > | double* internalGetArrayPointer(std::vector<Vector3d>& v); | 
| 124 |  |  | 
| 125 | < | double* internalGetArrayPointer(std::vector<RotMat3x3d>& v); | 
| 126 | < | double* internalGetArrayPointer(std::vector<double>& v); | 
| 125 | > | double* internalGetArrayPointer(std::vector<RotMat3x3d>& v); | 
| 126 | > | double* internalGetArrayPointer(std::vector<double>& v); | 
| 127 |  |  | 
| 128 | < | template<typename T> | 
| 129 | < | void internalResize(std::vector<T>& v, int newSize); | 
| 128 | > | template<typename T> | 
| 129 | > | void internalResize(std::vector<T>& v, int newSize); | 
| 130 |  |  | 
| 131 | < | template<typename T> | 
| 132 | < | void internalCopy(std::vector<T>& v, int source,  int num, int target); | 
| 131 | > | template<typename T> | 
| 132 | > | void internalCopy(std::vector<T>& v, int source,  int num, int target); | 
| 133 |  |  | 
| 134 | < | int size_; | 
| 135 | < | int storageLayout_; | 
| 134 | > | int size_; | 
| 135 | > | int storageLayout_; | 
| 136 |  |  | 
| 137 | < | }; | 
| 137 | > | }; | 
| 138 |  |  | 
| 139 |  | } | 
| 140 |  | #endif //BRAINS_DATASTORAGE_HPP |