Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4DataVector.cc
Go to the documentation of this file.
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// --------------------------------------------------------------------
36 : std::vector<G4double>(cap, 0.0)
37{}
38
39// --------------------------------------------------------------------
40G4DataVector::G4DataVector(std::size_t cap, G4double value)
41 : std::vector<G4double>(cap, value)
42{}
43
44// --------------------------------------------------------------------
45G4bool 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 G4int sizeV = G4int(size());
56 fOut.write((char*) (&sizeV), sizeof sizeV);
57
58 G4double* 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// --------------------------------------------------------------------
71G4bool 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 G4double* 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// --------------------------------------------------------------------
129std::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}
std::ostream & operator<<(std::ostream &out, const G4DataVector &pv)
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
G4GLOB_DLL std::ostream G4cerr
#define G4endl
Definition: G4ios.hh:57
G4bool Store(std::ofstream &fOut, G4bool ascii=false)
Definition: G4DataVector.cc:45
G4bool Retrieve(std::ifstream &fIn, G4bool ascii=false)
Definition: G4DataVector.cc:71
G4DataVector()=default