File: AipsrcVector.h

package info (click to toggle)
casacore 3.8.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 51,908 kB
  • sloc: cpp: 471,569; fortran: 16,372; ansic: 7,416; yacc: 4,714; lex: 2,346; sh: 1,865; python: 629; perl: 531; sed: 499; csh: 201; makefile: 32
file content (204 lines) | stat: -rw-r--r-- 6,802 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
//# AipsrcVector.h: Read multiple values from the  Aipsrc resource files
//# Copyright (C) 1995,1996,1997,1999,2002
//# Associated Universities, Inc. Washington DC, USA.
//#
//# This library is free software; you can redistribute it and/or modify it
//# under the terms of the GNU Library General Public License as published by
//# the Free Software Foundation; either version 2 of the License, or (at your
//# option) any later version.
//#
//# This library is distributed in the hope that it will be useful, but WITHOUT
//# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
//# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
//# License for more details.
//#
//# You should have received a copy of the GNU Library General Public License
//# along with this library; if not, write to the Free Software Foundation,
//# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
//#
//# Correspondence concerning AIPS++ should be addressed as follows:
//#        Internet email: casa-feedback@nrao.edu.
//#        Postal address: AIPS++ Project Office
//#                        National Radio Astronomy Observatory
//#                        520 Edgemont Road
//#                        Charlottesville, VA 22903-2475 USA

#ifndef CASA_AIPSRCVECTOR_H
#define CASA_AIPSRCVECTOR_H

#include <casacore/casa/aips.h>
#include <casacore/casa/Arrays/ArrayFwd.h>
#include <casacore/casa/BasicSL/String.h>
#include <casacore/casa/System/Aipsrc.h>

#include <mutex>
#include <vector>

namespace casacore { //# NAMESPACE CASACORE - BEGIN

//# Forward declarations
class Unit;

// <summary> Read multiple values from the  Aipsrc resource files </summary>

// <use visibility=export>

// <reviewed reviewer="mhaller" date="1997/10/08" tests="tAipsrcValue" demos="">
// </reviewed>

// <prerequisite>
//  <li> <linkto class=AipsrcValue>AipsrcValue</linkto>
// </prerequisite>
//
// <etymology>
// A class for getting multiple values from the Aipsrc files
// </etymology>
//
// <synopsis>
// The available functions (and notes) are the same as in
// <linkto class=AipsrcValue>AipsrcValue</linkto>, but with a Vector result.
// </synopsis>
// 
// <templating>
//  <li> All types with a <src>>></src> defined. 
// <note role=warning>
// Since interpretation of the keyword value string is done with the standard
// input right-shift operator, specialisations are necessary for non-standard
// cases like Bool and String. They are provided.
// </note>
// </templating>
//
// <example>
// </example>
//
// <motivation>
// Programs need a way to get multi-valued keywords from the Aipsrc files.
// </motivation>
//
// <thrown>
//    <li>AipsError if the environment variables HOME and/or AIPSPATH not set.
// </thrown>
//
// <todo asof="1997/08/07">
// </todo>

template <class T> class AipsrcVector : public Aipsrc {

public:
  //# Member functions
  // The <src>find()</src> functions will, given a keyword, return the value
  // of a matched keyword found in the files. If no match found the
  // function will be False, and the default returned if specified.
  // <group>
  static Bool find(Vector<T> &value, const String &keyword);
  static Bool find(Vector<T> &value, const String &keyword, 
		   const Vector<T> &deflt);
  // </group>
  // These <src>find()</src> functions will, given a keyword, read the values
  // of a matched keyword as a Quantity. If no unit has been given in the
  // keyword value, the defun Unit will be assumed. The value returned
  // will be converted to the resun Unit. If no match found, the default
  // value is returned (see example above).
  // <group>
  static Bool find(Vector<T> &value, const String &keyword,
		   const Unit &defun, const Unit &resun);
  static Bool find(Vector<T> &value, const String &keyword,
		   const Unit &defun, const Unit &resun,
		   const Vector<T> &deflt);
  // </group>
  // Functions to register keywords for later use in get() and set(). The
  // returned value is the index for get() and set().
  // <group>
  static uInt registerRC(const String &keyword,
			 const Vector<T> &deflt);
  static uInt registerRC(const String &keyword,
			 const Unit &defun, const Unit &resun,
			 const Vector<T> &deflt);
  // </group>
  
  // Gets are like find, but using registered integers rather than names.
  // <group>
  static const Vector<T> get(uInt keyword);
  // </group>
  
  // Sets allow registered values to be set
  // <group>
  static void set(uInt keyword, const Vector<T> &deflt);
  // </group>
  
  // Save registered value to <src>$HOME/.aipsrc</src>
  static void save(uInt keyword);

private:
  //# Data
  inline static std::mutex theirMutex;
  // register list
  // <group>
  inline static std::vector<Vector<T> > tlst;
  inline static std::vector<String> ntlst;
  // </group>
};

#define AipsrcVector_String AipsrcVector

// <summary> Specialization of AipsrcVector for String </summary>

// <synopsis>
// <note role=warning>
// The name <src>AipsrcVector_String</src> is only for cxx2html
// documentation problems. Use <src>AipsrcVector</src> in your code.</note>
// </synopsis>

template <> class AipsrcVector_String<String> : public Aipsrc {
 public:
  static Bool find(Vector<String> &value, const String &keyword);
  static Bool find(Vector<String> &value, const String &keyword, 
		   const Vector<String> &deflt);
  static uInt registerRC(const String &keyword, const Vector<String> &deflt);
  static const Vector<String> get(uInt keyword);
  static void set(uInt keyword, const Vector<String> &deflt);
  static void save(uInt keyword);

private:
  inline static std::mutex theirMutex;
  inline static std::vector<Vector<String> > tlst;
  inline static std::vector<String> ntlst;
};

#undef AipsrcVector_String

#define AipsrcVector_Bool AipsrcVector

// <summary> Specialization of AipsrcVector for Bool </summary>

// <synopsis>
// <note role=warning>
// The name <src>AipsrcVector_Bool</src> is only for cxx2html
// documentation problems. Use <src>AipsrcVector</src> in your code.</note>
// </synopsis>

template <> class AipsrcVector_Bool<Bool> : public Aipsrc {
 public:
  static Bool find(Vector<Bool> &value, const String &keyword);
  static Bool find(Vector<Bool> &value, const String &keyword, 
		   const Vector<Bool> &deflt);
  static uInt registerRC(const String &keyword, const Vector<Bool> &deflt);
  static const Vector<Bool> get(uInt keyword);
  static void set(uInt keyword, const Vector<Bool> &deflt);
  static void save(uInt keyword);

private:
  inline static std::mutex theirMutex;
  inline static std::vector<Vector<Bool> > tlst;
  inline static std::vector<String> ntlst;
};

#undef AipsrcVector_Bool


} //# NAMESPACE CASACORE - END

#ifndef CASACORE_NO_AUTO_TEMPLATES
#include <casacore/casa/System/AipsrcVector.tcc>
#endif //# CASACORE_NO_AUTO_TEMPLATES
#endif