Commit 8bd2a08f112b6a5c1c0f925e3f4677a3fee75897

Authored by knodlseder
1 parent bf647a55

declare sky direction access and distance methods as const (circumvent const-correctness)

include/GSkyDir.hpp
... ... @@ -27,6 +27,15 @@
27 27 * @class GSkyDir
28 28 *
29 29 * @brief GSkyDir class interface defintion
  30 + *
  31 + * The GSkyDir class implements a coordinate on the sphere. Two coordinate
  32 + * systems are supported: celestial (or equatorial), defined by Right
  33 + * Ascension and Declination, and galactic, defined by galactic longitude
  34 + * and galactic latitude. The class provides automatic conversion between
  35 + * both systems if required. Coordinates are stored in either of the
  36 + * systems (in units of radians), and conversion is performed (and stored)
  37 + * if requested. Coordinates can be given and returned in radians or in
  38 + * degrees. Note that the epoch for celestial coordinates is fixed to J2000.
30 39 ***************************************************************************/
31 40 class GSkyDir {
32 41  
... ... @@ -35,9 +44,9 @@ class GSkyDir {
35 44  
36 45 public:
37 46 // Constructors and destructors
38   - GSkyDir();
  47 + GSkyDir(void);
39 48 GSkyDir(const GSkyDir& dir);
40   - virtual ~GSkyDir();
  49 + virtual ~GSkyDir(void);
41 50  
42 51 // Operators
43 52 GSkyDir& operator= (const GSkyDir& dir);
... ... @@ -47,28 +56,30 @@ public:
47 56 void radec_deg(const double& ra, const double& dec);
48 57 void lb(const double& l, const double& b);
49 58 void lb_deg(const double& l, const double& b);
50   - double l(void);
51   - double l_deg(void);
52   - double b(void);
53   - double b_deg(void);
54   - double ra(void);
55   - double ra_deg(void);
56   - double dec(void);
57   - double dec_deg(void);
58   - double dist(GSkyDir& dir);
59   - double dist_deg(GSkyDir& dir);
  59 + double l(void) const;
  60 + double l_deg(void) const;
  61 + double b(void) const;
  62 + double b_deg(void) const;
  63 + double ra(void) const;
  64 + double ra_deg(void) const;
  65 + double dec(void) const;
  66 + double dec_deg(void) const;
  67 + double dist(GSkyDir& dir) const;
  68 + double dist_deg(GSkyDir& dir) const;
60 69  
61 70 private:
62 71 // Private methods
63 72 void init_members(void);
64 73 void copy_members(const GSkyDir& dir);
65 74 void free_members(void);
66   - void equ2gal(void);
67   - void gal2equ(void);
68   -
  75 + void equ2gal(void) const;
  76 + void gal2equ(void) const;
  77 + void euler(const int& type, const double& xin, const double &yin,
  78 + double* xout, double *yout) const;
  79 +
69 80 // Private data area
70   - int m_has_lb; //!< Has galactic coordinates
71   - int m_has_radec; //!< Has equatorial coordinates
  81 + bool m_has_lb; //!< Has galactic coordinates
  82 + bool m_has_radec; //!< Has equatorial coordinates
72 83 double m_l; //!< Galactic longitude in radians
73 84 double m_b; //!< Galactic latitude in radians
74 85 double m_ra; //!< Right Ascension in radians
... ...
pyext/GSkyDir.i
1 1 /***************************************************************************
2 2 * GSkyDir.i - Sky direction class SWIG file *
3 3 * ----------------------------------------------------------------------- *
4   - * copyright : (C) 2008 by Jurgen Knodlseder *
  4 + * copyright (C) 2008-2010 by Jurgen Knodlseder *
5 5 * ----------------------------------------------------------------------- *
6 6 * *
7 7 * This program is free software; you can redistribute it and/or modify *
... ... @@ -29,23 +29,25 @@
29 29 class GSkyDir {
30 30 public:
31 31 // Constructors and destructors
32   - GSkyDir();
  32 + GSkyDir(void);
33 33 GSkyDir(const GSkyDir& dir);
34   - virtual ~GSkyDir();
  34 + virtual ~GSkyDir(void);
35 35  
36 36 // Methods
37 37 void radec(const double& ra, const double& dec);
38 38 void radec_deg(const double& ra, const double& dec);
39 39 void lb(const double& l, const double& b);
40 40 void lb_deg(const double& l, const double& b);
41   - double l(void);
42   - double l_deg(void);
43   - double b(void);
44   - double b_deg(void);
45   - double ra(void);
46   - double ra_deg(void);
47   - double dec(void);
48   - double dec_deg(void);
  41 + double l(void) const;
  42 + double l_deg(void) const;
  43 + double b(void) const;
  44 + double b_deg(void) const;
  45 + double ra(void) const;
  46 + double ra_deg(void) const;
  47 + double dec(void) const;
  48 + double dec_deg(void) const;
  49 + double dist(GSkyDir& dir) const;
  50 + double dist_deg(GSkyDir& dir) const;
49 51 };
50 52  
51 53  
... ...
src/sky/GSkyDir.cpp
... ... @@ -33,20 +33,18 @@
33 33  
34 34 /* __ Debug definitions __________________________________________________ */
35 35  
36   -/* __ Prototype __________________________________________________________ */
37   -void euler(const int& type, const double& xin, const double &yin,
38   - double* xout, double *yout);
  36 +/* __ Prototypes _________________________________________________________ */
39 37  
40 38 /*==========================================================================
41 39 = =
42   - = GSkyDir constructors/destructors =
  40 + = Constructors/destructors =
43 41 = =
44 42 ==========================================================================*/
45 43  
46 44 /***********************************************************************//**
47 45 * @brief Constructor
48 46 ***************************************************************************/
49   -GSkyDir::GSkyDir()
  47 +GSkyDir::GSkyDir(void)
50 48 {
51 49 // Initialise class members for clean destruction
52 50 init_members();
... ... @@ -77,7 +75,7 @@ GSkyDir::GSkyDir(const GSkyDir&amp; dir)
77 75 /***********************************************************************//**
78 76 * @brief Destructor
79 77 ***************************************************************************/
80   -GSkyDir::~GSkyDir()
  78 +GSkyDir::~GSkyDir(void)
81 79 {
82 80 // Free members
83 81 free_members();
... ... @@ -89,7 +87,7 @@ GSkyDir::~GSkyDir()
89 87  
90 88 /*==========================================================================
91 89 = =
92   - = GSkyDir operators =
  90 + = Operators =
93 91 = =
94 92 ==========================================================================*/
95 93  
... ... @@ -121,7 +119,7 @@ GSkyDir&amp; GSkyDir::operator= (const GSkyDir&amp; dir)
121 119  
122 120 /*==========================================================================
123 121 = =
124   - = GSkyDir public methods =
  122 + = Public methods =
125 123 = =
126 124 ==========================================================================*/
127 125  
... ... @@ -134,8 +132,8 @@ GSkyDir&amp; GSkyDir::operator= (const GSkyDir&amp; dir)
134 132 void GSkyDir::radec(const double& ra, const double& dec)
135 133 {
136 134 // Set attributes
137   - m_has_lb = 0;
138   - m_has_radec = 1;
  135 + m_has_lb = false;
  136 + m_has_radec = true;
139 137  
140 138 // Set direction
141 139 m_ra = ra;
... ... @@ -155,8 +153,8 @@ void GSkyDir::radec(const double&amp; ra, const double&amp; dec)
155 153 void GSkyDir::radec_deg(const double& ra, const double& dec)
156 154 {
157 155 // Set attributes
158   - m_has_lb = 0;
159   - m_has_radec = 1;
  156 + m_has_lb = false;
  157 + m_has_radec = true;
160 158  
161 159 // Set direction
162 160 m_ra = ra * deg2rad;
... ... @@ -176,8 +174,8 @@ void GSkyDir::radec_deg(const double&amp; ra, const double&amp; dec)
176 174 void GSkyDir::lb(const double& l, const double& b)
177 175 {
178 176 // Set attributes
179   - m_has_lb = 1;
180   - m_has_radec = 0;
  177 + m_has_lb = true;
  178 + m_has_radec = false;
181 179  
182 180 // Set direction
183 181 m_l = l;
... ... @@ -197,8 +195,8 @@ void GSkyDir::lb(const double&amp; l, const double&amp; b)
197 195 void GSkyDir::lb_deg(const double& l, const double& b)
198 196 {
199 197 // Set attributes
200   - m_has_lb = 1;
201   - m_has_radec = 0;
  198 + m_has_lb = true;
  199 + m_has_radec = false;
202 200  
203 201 // Set direction
204 202 m_l = l * deg2rad;
... ... @@ -212,7 +210,7 @@ void GSkyDir::lb_deg(const double&amp; l, const double&amp; b)
212 210 /***********************************************************************//**
213 211 * @brief Returns galactic longitude in radians
214 212 ***************************************************************************/
215   -double GSkyDir::l(void)
  213 +double GSkyDir::l(void) const
216 214 {
217 215 // If we have no galactic coordinates then get them now
218 216 if (!m_has_lb && m_has_radec)
... ... @@ -226,7 +224,7 @@ double GSkyDir::l(void)
226 224 /***********************************************************************//**
227 225 * @brief Returns galactic longitude in degrees
228 226 ***************************************************************************/
229   -double GSkyDir::l_deg(void)
  227 +double GSkyDir::l_deg(void) const
230 228 {
231 229 // If we have no galactic coordinates then get them now
232 230 if (!m_has_lb && m_has_radec)
... ... @@ -240,7 +238,7 @@ double GSkyDir::l_deg(void)
240 238 /***********************************************************************//**
241 239 * @brief Returns galactic latitude in radians
242 240 ***************************************************************************/
243   -double GSkyDir::b(void)
  241 +double GSkyDir::b(void) const
244 242 {
245 243 // If we have no galactic coordinates then get them now
246 244 if (!m_has_lb && m_has_radec)
... ... @@ -254,7 +252,7 @@ double GSkyDir::b(void)
254 252 /***********************************************************************//**
255 253 * @brief Returns galactic latitude in degrees
256 254 ***************************************************************************/
257   -double GSkyDir::b_deg(void)
  255 +double GSkyDir::b_deg(void) const
258 256 {
259 257 // If we have no galactic coordinates then get them now
260 258 if (!m_has_lb && m_has_radec)
... ... @@ -268,7 +266,7 @@ double GSkyDir::b_deg(void)
268 266 /***********************************************************************//**
269 267 * @brief Returns Right Ascension in radians
270 268 ***************************************************************************/
271   -double GSkyDir::ra(void)
  269 +double GSkyDir::ra(void) const
272 270 {
273 271 // If we have no equatorial coordinates then get them now
274 272 if (!m_has_radec && m_has_lb)
... ... @@ -282,7 +280,7 @@ double GSkyDir::ra(void)
282 280 /***********************************************************************//**
283 281 * @brief Returns Right Ascension in degrees
284 282 ***************************************************************************/
285   -double GSkyDir::ra_deg(void)
  283 +double GSkyDir::ra_deg(void) const
286 284 {
287 285 // If we have no equatorial coordinates then get them now
288 286 if (!m_has_radec && m_has_lb)
... ... @@ -296,7 +294,7 @@ double GSkyDir::ra_deg(void)
296 294 /***********************************************************************//**
297 295 * @brief Returns Declination in radians
298 296 ***************************************************************************/
299   -double GSkyDir::dec(void)
  297 +double GSkyDir::dec(void) const
300 298 {
301 299 // If we have no equatorial coordinates then get them now
302 300 if (!m_has_radec && m_has_lb)
... ... @@ -310,7 +308,7 @@ double GSkyDir::dec(void)
310 308 /***********************************************************************//**
311 309 * @brief Returns Declination in degrees
312 310 ***************************************************************************/
313   -double GSkyDir::dec_deg(void)
  311 +double GSkyDir::dec_deg(void) const
314 312 {
315 313 // If we have no equatorial coordinates then get them now
316 314 if (!m_has_radec && m_has_lb)
... ... @@ -326,7 +324,7 @@ double GSkyDir::dec_deg(void)
326 324 *
327 325 * @param[in] dir Sky direction to which distance is to be computed.
328 326 ***************************************************************************/
329   -double GSkyDir::dist(GSkyDir& dir)
  327 +double GSkyDir::dist(GSkyDir& dir) const
330 328 {
331 329 // Initialise cosine of distance
332 330 double cosdis;
... ... @@ -371,7 +369,7 @@ double GSkyDir::dist(GSkyDir&amp; dir)
371 369 *
372 370 * @param[in] dir Sky direction to which distance is to be computed.
373 371 ***************************************************************************/
374   -double GSkyDir::dist_deg(GSkyDir& dir)
  372 +double GSkyDir::dist_deg(GSkyDir& dir) const
375 373 {
376 374 // Return distance in degrees
377 375 return (dist(dir) * rad2deg);
... ... @@ -380,7 +378,7 @@ double GSkyDir::dist_deg(GSkyDir&amp; dir)
380 378  
381 379 /*==========================================================================
382 380 = =
383   - = GSkyDir private methods =
  381 + = Private methods =
384 382 = =
385 383 ==========================================================================*/
386 384  
... ... @@ -390,8 +388,8 @@ double GSkyDir::dist_deg(GSkyDir&amp; dir)
390 388 void GSkyDir::init_members(void)
391 389 {
392 390 // Initialise members
393   - m_has_lb = 0;
394   - m_has_radec = 0;
  391 + m_has_lb = false;
  392 + m_has_radec = false;
395 393 m_l = 0.0;
396 394 m_b = 0.0;
397 395 m_ra = 0.0;
... ... @@ -427,10 +425,6 @@ void GSkyDir::copy_members(const GSkyDir&amp; dir)
427 425 ***************************************************************************/
428 426 void GSkyDir::free_members(void)
429 427 {
430   - // Free memory
431   -
432   - // Signal free pointers
433   -
434 428 // Return
435 429 return;
436 430 }
... ... @@ -439,10 +433,16 @@ void GSkyDir::free_members(void)
439 433 /***********************************************************************//**
440 434 * @brief Convert equatorial to galactic coordinates
441 435 ***************************************************************************/
442   -void GSkyDir::equ2gal(void)
  436 +void GSkyDir::equ2gal(void) const
443 437 {
  438 + // Get non-const pointers to data members. This allows to circumvent
  439 + // the const correctness and allows treating GSkyDir access methods
  440 + // as const
  441 + double* l = (double*)&m_l;
  442 + double* b = (double*)&m_b;
  443 +
444 444 // Convert from equatorial to galactic
445   - euler(0, m_ra, m_dec, &m_l, &m_b);
  445 + euler(0, m_ra, m_dec, l, b);
446 446  
447 447 // Return
448 448 return;
... ... @@ -452,47 +452,22 @@ void GSkyDir::equ2gal(void)
452 452 /***********************************************************************//**
453 453 * @brief Convert galactic to equatorial coordinates
454 454 ***************************************************************************/
455   -void GSkyDir::gal2equ(void)
  455 +void GSkyDir::gal2equ(void) const
456 456 {
  457 + // Get non-const pointers to data members. This allows to circumvent
  458 + // the const correctness and allows treating GSkyDir access methods
  459 + // as const
  460 + double* ra = (double*)&m_ra;
  461 + double* dec = (double*)&m_dec;
  462 +
457 463 // Convert from galactic to equatorial
458   - euler(1, m_l, m_b, &m_ra, &m_dec);
  464 + euler(1, m_l, m_b, ra, dec);
459 465  
460 466 // Return
461 467 return;
462 468 }
463 469  
464 470  
465   -/*==========================================================================
466   - = =
467   - = GSkyDir friends =
468   - = =
469   - ==========================================================================*/
470   -
471   -/***********************************************************************//**
472   - * @brief Output operator
473   - *
474   - * @param[in] os Output stream
475   - * @param[in] column Sky direction to put in output stream
476   - ***************************************************************************/
477   -std::ostream& operator<< (std::ostream& os, const GSkyDir& dir)
478   -{
479   - // Create coordinate system dependent output
480   - if (dir.m_has_lb)
481   - os << "(l,b)=(" << dir.m_l*rad2deg << "," << dir.m_b*rad2deg << ")";
482   - else if (dir.m_has_radec)
483   - os << "(RA,Dec)=(" << dir.m_ra*rad2deg << "," << dir.m_dec*rad2deg << ")";
484   -
485   - // Return output stream
486   - return os;
487   -}
488   -
489   -
490   -/*==========================================================================
491   - = =
492   - = Other functions used by GSkyDir =
493   - = =
494   - ==========================================================================*/
495   -
496 471 /***********************************************************************//**
497 472 * @brief General coordinate transformation routine for J2000
498 473 *
... ... @@ -502,8 +477,8 @@ std::ostream&amp; operator&lt;&lt; (std::ostream&amp; os, const GSkyDir&amp; dir)
502 477 * @param[out] xout Output longitude in radians.
503 478 * @param[out] yout Output latitude in radians.
504 479 ***************************************************************************/
505   -void euler(const int& type, const double& xin, const double &yin,
506   - double* xout, double *yout)
  480 +void GSkyDir::euler(const int& type, const double& xin, const double &yin,
  481 + double* xout, double *yout) const
507 482 {
508 483 // Set transformation constants
509 484 const double psi[] = {0.57477043300, 4.9368292465};
... ... @@ -531,3 +506,28 @@ void euler(const int&amp; type, const double&amp; xin, const double &amp;yin,
531 506 // Return
532 507 return;
533 508 }
  509 +
  510 +
  511 +/*==========================================================================
  512 + = =
  513 + = Friends =
  514 + = =
  515 + ==========================================================================*/
  516 +
  517 +/***********************************************************************//**
  518 + * @brief Output operator
  519 + *
  520 + * @param[in] os Output stream
  521 + * @param[in] column Sky direction to put in output stream
  522 + ***************************************************************************/
  523 +std::ostream& operator<< (std::ostream& os, const GSkyDir& dir)
  524 +{
  525 + // Create coordinate system dependent output
  526 + if (dir.m_has_lb)
  527 + os << "(l,b)=(" << dir.m_l*rad2deg << "," << dir.m_b*rad2deg << ")";
  528 + else if (dir.m_has_radec)
  529 + os << "(RA,Dec)=(" << dir.m_ra*rad2deg << "," << dir.m_dec*rad2deg << ")";
  530 +
  531 + // Return output stream
  532 + return os;
  533 +}
... ...