00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef O2SCL_NUCLEAR_DIST_H
00024 #define O2SCL_NUCLEAR_DIST_H
00025
00026 #include <iostream>
00027 #include <o2scl/nucleus.h>
00028 #include <o2scl/nuclear_mass.h>
00029
00030 #ifndef DOXYGENP
00031 namespace o2scl {
00032 #endif
00033
00034
00035
00036
00037
00038
00039 class nuclear_dist {
00040
00041 #ifndef DOXYGENP
00042
00043 protected:
00044
00045 virtual nucleus *next(nucleus *np)=0;
00046
00047 #endif
00048
00049 public:
00050
00051 virtual ~nuclear_dist() {}
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 class iterator {
00069
00070 #ifndef DOXYGEN_INTERNAL
00071
00072 protected:
00073
00074
00075 nucleus *np;
00076
00077
00078 nuclear_dist *ndp;
00079
00080 #endif
00081
00082 public:
00083
00084 #ifndef DOXYGEN_INTERNAL
00085
00086
00087
00088
00089 iterator(nuclear_dist *ndpp, nucleus *npp) {
00090 ndp=ndpp;
00091 np=npp;
00092 }
00093
00094 #endif
00095
00096
00097 iterator operator++() {
00098 np=ndp->next(np);
00099 return iterator(ndp,np);
00100 }
00101
00102
00103 iterator operator++(int unused) {
00104 nucleus *tmp=np;
00105 np=ndp->next(np);
00106 return iterator(ndp,tmp);
00107 }
00108
00109
00110 nucleus *operator->() const {
00111 return np;
00112 };
00113
00114 friend int operator==(const nuclear_dist::iterator &i1,
00115 const nuclear_dist::iterator &i2);
00116
00117 friend int operator!=(const nuclear_dist::iterator &i1,
00118 const nuclear_dist::iterator &i2);
00119 };
00120
00121
00122 virtual iterator begin()=0;
00123
00124
00125 virtual iterator end()=0;
00126
00127
00128 virtual size_t size()=0;
00129 };
00130
00131
00132 int operator==(const nuclear_dist::iterator &i1,
00133 const nuclear_dist::iterator &i2);
00134
00135
00136 int operator!=(const nuclear_dist::iterator &i1,
00137 const nuclear_dist::iterator &i2);
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150 class simple_dist : public nuclear_dist {
00151 public:
00152
00153 simple_dist();
00154
00155
00156
00157
00158
00159
00160
00161 simple_dist(int minZ, int maxZ, int minA[], int maxA[],
00162 nuclear_mass *nm);
00163
00164
00165 simple_dist(int minZ, int maxZ, int minA, int maxA,
00166 nuclear_mass *nm);
00167
00168 virtual ~simple_dist();
00169
00170
00171 virtual iterator begin() {
00172 return iterator(this,list);
00173 };
00174
00175
00176 virtual iterator end() {
00177 return iterator(this,list+list_size);
00178 };
00179
00180
00181 virtual size_t size() {
00182 return list_size;
00183 };
00184
00185
00186
00187
00188
00189
00190
00191 int set_dist(int minZ, int maxZ, int minA[], int maxA[],
00192 nuclear_mass *nm);
00193
00194
00195 int set_dist(int minZ, int maxZ, int minA, int maxA,
00196 nuclear_mass *nm);
00197
00198 #ifndef DOXYGENP
00199
00200 protected:
00201
00202
00203 virtual nucleus *next(nucleus *np) {
00204 return np+1;
00205 }
00206
00207
00208 nucleus *list;
00209
00210
00211 int *min_A;
00212
00213
00214 int *max_A;
00215
00216
00217 int min_Z;
00218
00219
00220 int max_Z;
00221
00222
00223 size_t list_size;
00224
00225
00226 bool alloc;
00227
00228 #endif
00229
00230 };
00231
00232
00233
00234
00235
00236 class full_dist : public nuclear_dist {
00237 public:
00238
00239 full_dist() {
00240 list_size=0;
00241 }
00242
00243
00244
00245
00246
00247
00248
00249 full_dist(nuclear_mass *nm, int maxA=400, bool include_neutron=false);
00250
00251
00252
00253
00254
00255
00256
00257 int set_dist(nuclear_mass *nm, int maxA=400, bool include_neutron=false);
00258
00259 virtual ~full_dist() {
00260 if (list_size>0) delete[] list;
00261 }
00262
00263
00264 virtual iterator begin() {
00265 return iterator(this,&list[0]);
00266 };
00267
00268
00269 virtual iterator end() {
00270 return iterator(this,&list[list_size-1]);
00271 };
00272
00273
00274 virtual size_t size() {
00275 return list_size;
00276 };
00277
00278 #ifndef DOXYGENP
00279
00280 protected:
00281
00282
00283 virtual nucleus *next(nucleus *np) {
00284 return np+1;
00285 }
00286
00287
00288 nucleus *list;
00289
00290
00291 size_t list_size;
00292
00293 #endif
00294
00295 };
00296
00297 #ifndef DOXYGENP
00298 }
00299 #endif
00300
00301 #endif