Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 // G4DataVector class implementation 27 // 28 // Author: H.Kurashige, 18 September 2001 29 // -------------------------------------------------------------------- 30 31 #include "G4DataVector.hh" 32 #include <iomanip> 33 34 // -------------------------------------------------------------------- 35 G4DataVector::G4DataVector(std::size_t cap) 36 : std::vector<G4double>(cap, 0.0) 37 {} 38 39 // -------------------------------------------------------------------- 40 G4DataVector::G4DataVector(std::size_t cap, G4double value) 41 : std::vector<G4double>(cap, value) 42 {} 43 44 // -------------------------------------------------------------------- 45 G4bool G4DataVector::Store(std::ofstream& fOut, G4bool ascii) 46 { 47 // Ascii mode 48 if(ascii) 49 { 50 fOut << *this; 51 return true; 52 } 53 54 // Binary Mode 55 auto sizeV = G4int(size()); 56 fOut.write((char*) (&sizeV), sizeof sizeV); 57 58 auto value = new G4double[sizeV]; 59 std::size_t i = 0; 60 for(auto itr = cbegin(); itr != cend(); ++itr, ++i) 61 { 62 value[i] = *itr; 63 } 64 fOut.write((char*) (value), sizeV * (sizeof(G4double))); 65 delete[] value; 66 67 return true; 68 } 69 70 // -------------------------------------------------------------------- 71 G4bool G4DataVector::Retrieve(std::ifstream& fIn, G4bool ascii) 72 { 73 clear(); 74 G4int sizeV = 0; 75 76 // retrieve in ascii mode 77 if(ascii) 78 { 79 // contents 80 fIn >> sizeV; 81 if(fIn.fail()) 82 { 83 return false; 84 } 85 if(sizeV <= 0) 86 { 87 #ifdef G4VERBOSE 88 G4cerr << "G4DataVector::Retrieve():"; 89 G4cerr << " Invalid vector size: " << sizeV << G4endl; 90 #endif 91 return false; 92 } 93 94 reserve(sizeV); 95 for(G4int i = 0; i < sizeV; ++i) 96 { 97 G4double vData = 0.0; 98 fIn >> vData; 99 if(fIn.fail()) 100 { 101 return false; 102 } 103 push_back(vData); 104 } 105 return true; 106 } 107 108 // retrieve in binary mode 109 fIn.read((char*) (&sizeV), sizeof sizeV); 110 111 auto value = new G4double[sizeV]; 112 fIn.read((char*) (value), sizeV * (sizeof(G4double))); 113 if(G4int(fIn.gcount()) != G4int(sizeV * (sizeof(G4double)))) 114 { 115 delete[] value; 116 return false; 117 } 118 119 reserve(sizeV); 120 for(G4int i = 0; i < sizeV; ++i) 121 { 122 push_back(value[i]); 123 } 124 delete[] value; 125 return true; 126 } 127 128 // -------------------------------------------------------------------- 129 std::ostream& operator<<(std::ostream& out, const G4DataVector& pv) 130 { 131 out << pv.size() << std::setprecision(12) << G4endl; 132 for(std::size_t i = 0; i < pv.size(); ++i) 133 { 134 out << pv[i] << G4endl; 135 } 136 out << std::setprecision(6); 137 138 return out; 139 } 140