source: XIOS/trunk/src/interface/c/icdate.cpp @ 1542

Last change on this file since 1542 was 1542, checked in by oabramkina, 6 years ago

Replacing Boost's unordered_map and shared_pointer by its STL counterparts.

Two notes for Curie:

  • one can see the content of unordered_map with ddt only if XIOS has been compiled with gnu
  • XIOS will not compile any more with pgi (all available versions use old STL which are not up to the c++11 norms)
  • Property copyright set to
    Software name : XIOS (Xml I/O Server)
    http://forge.ipsl.jussieu.fr/ioserver
    Creation date : January 2009
    Licence : CeCCIL version2
    see license file in root directory : Licence_CeCILL_V2-en.txt
    or http://www.cecill.info/licences/Licence_CeCILL_V2-en.html
    Holder : CEA/LSCE (Laboratoire des Sciences du CLimat et de l'Environnement)
    CNRS/IPSL (Institut Pierre Simon Laplace)
    Project Manager : Yann Meurdesoif
    yann.meurdesoif@cea.fr
  • Property svn:eol-style set to native
File size: 9.9 KB
Line 
1/* ************************************************************************** *
2 *      Copyright © IPSL/LSCE, xios, Avril 2010 - Octobre 2011         *
3 * ************************************************************************** */
4
5#include <boost/multi_array.hpp>
6
7#include "xios.hpp"
8
9#include "attribute_template.hpp"
10#include "object_template.hpp"
11#include "group_template.hpp"
12
13#include "calendar_type.hpp"
14
15#include "icutil.hpp"
16#include "icdate.hpp"
17#include "exception.hpp"
18#include "calendar_util.hpp"
19#include "timer.hpp"
20#include "context.hpp"
21#include "context_client.hpp"
22
23static const xios::CCalendar& getCalendar(const std::string& idFunc)
24{
25  const xios::CContext* context = CContext::getCurrent();
26  if (!context)
27    ERROR(idFunc, << "Impossible to do calendar operations: no current context available.");
28  const std::shared_ptr<xios::CCalendar> cal = context->getCalendar();
29  if (!cal)
30    ERROR(idFunc, << "Impossible to do calendar operations: no calendar was defined.");
31  return *cal;
32}
33
34extern "C"
35{
36  long long int cxios_date_convert_to_seconds(cxios_date date_c)
37  {
38    xios::CDate date = xios::CDate(getCalendar("long long int cxios_date_convert_to_seconds(cxios_date date_c)"),
39                                   date_c.year, date_c.month, date_c.day,
40                                   date_c.hour, date_c.minute, date_c.second);
41    return date;
42  }
43
44  void cxios_date_convert_to_string(cxios_date date_c, char* str, int str_size)
45  {
46    xios::CDate date = xios::CDate(getCalendar("void cxios_date_convert_to_string(cxios_date date_c, char* str, int str_size)"),
47                                   date_c.year, date_c.month, date_c.day,
48                                   date_c.hour, date_c.minute, date_c.second);
49
50    if (!string_copy(date.toString(), str, str_size))
51      ERROR("void cxios_date_convert_to_string(cxios_date date_c, char* str, int str_size)", << "Input string is too short");
52  }
53
54  cxios_date cxios_date_convert_from_string(const char* str, int str_size)
55  {
56    std::string date_str;
57    xios::CDate date;
58
59    if (cstr2string(str, str_size, date_str))
60      date = xios::CDate::FromString(date_str,
61                                     getCalendar("cxios_date cxios_date_convert_from_string(const char* str, int str_size)"));
62
63    return { date.getYear(), date.getMonth(), date.getDay(), date.getHour(), date.getMinute(), date.getSecond() };
64  }
65
66  cxios_date cxios_date_add_duration(cxios_date date_c, cxios_duration dur_c)
67  {
68    xios::CDate date = xios::CDate(getCalendar("cxios_date cxios_date_add_duration(cxios_date date_c, cxios_duration dur_c)"),
69                                   date_c.year, date_c.month, date_c.day,
70                                   date_c.hour, date_c.minute, date_c.second);
71    xios::CDuration dur( dur_c.year, dur_c.month, dur_c.day, dur_c.hour, dur_c.minute, dur_c.second, dur_c.timestep );
72    xios::CDate res = date + dur;
73    return { res.getYear(), res.getMonth(), res.getDay(), res.getHour(), res.getMinute(), res.getSecond() };
74  }
75
76  cxios_date cxios_date_sub_duration(cxios_date date_c, cxios_duration dur_c)
77  {
78    xios::CDate date = xios::CDate(getCalendar("cxios_date cxios_date_sub_duration(cxios_date date_c, cxios_duration dur_c)"),
79                                   date_c.year, date_c.month, date_c.day,
80                                   date_c.hour, date_c.minute, date_c.second);
81    xios::CDuration dur( dur_c.year, dur_c.month, dur_c.day, dur_c.hour, dur_c.minute, dur_c.second, dur_c.timestep );
82
83    xios::CDate res = date - dur;
84    return { res.getYear(), res.getMonth(), res.getDay(), res.getHour(), res.getMinute(), res.getSecond() };
85  }
86
87  cxios_duration cxios_date_sub(cxios_date date1_c, cxios_date date2_c)
88  {
89    xios::CDate date1 = xios::CDate(getCalendar("cxios_duration cxios_date_sub(cxios_date date1_c, cxios_date date2_c)"),
90                                    date1_c.year, date1_c.month, date1_c.day,
91                                    date1_c.hour, date1_c.minute, date1_c.second);
92    xios::CDate date2 = xios::CDate(getCalendar("cxios_duration cxios_date_sub(cxios_date date1_c, cxios_date date2_c)"),
93                                    date2_c.year, date2_c.month, date2_c.day,
94                                    date2_c.hour, date2_c.minute, date2_c.second);
95    xios::CDuration res = date1 - date2;
96    return { res.year, res.month, res.day, res.hour, res.minute, res.second, res.timestep };
97  }
98
99  bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)
100  {
101    xios::CDate date1 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
102                                    date1_c.year, date1_c.month, date1_c.day,
103                                    date1_c.hour, date1_c.minute, date1_c.second);
104    xios::CDate date2 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
105                                    date2_c.year, date2_c.month, date2_c.day,
106                                    date2_c.hour, date2_c.minute, date2_c.second);
107    return (date1 == date2);
108  }
109
110  bool cxios_date_neq(cxios_date date1_c, cxios_date date2_c)
111  {
112    xios::CDate date1 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
113                                    date1_c.year, date1_c.month, date1_c.day,
114                                    date1_c.hour, date1_c.minute, date1_c.second);
115    xios::CDate date2 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
116                                    date2_c.year, date2_c.month, date2_c.day,
117                                    date2_c.hour, date2_c.minute, date2_c.second);
118    return (date1 != date2);
119  }
120
121  bool cxios_date_lt(cxios_date date1_c, cxios_date date2_c)
122  {
123    xios::CDate date1 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
124                                    date1_c.year, date1_c.month, date1_c.day,
125                                    date1_c.hour, date1_c.minute, date1_c.second);
126    xios::CDate date2 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
127                                    date2_c.year, date2_c.month, date2_c.day,
128                                    date2_c.hour, date2_c.minute, date2_c.second);
129    return (date1 < date2);
130  }
131
132  bool cxios_date_le(cxios_date date1_c, cxios_date date2_c)
133  {
134    xios::CDate date1 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
135                                    date1_c.year, date1_c.month, date1_c.day,
136                                    date1_c.hour, date1_c.minute, date1_c.second);
137    xios::CDate date2 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
138                                    date2_c.year, date2_c.month, date2_c.day,
139                                    date2_c.hour, date2_c.minute, date2_c.second);
140    return (date1 <= date2);
141  }
142
143  bool cxios_date_gt(cxios_date date1_c, cxios_date date2_c)
144  {
145    xios::CDate date1 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
146                                    date1_c.year, date1_c.month, date1_c.day,
147                                    date1_c.hour, date1_c.minute, date1_c.second);
148    xios::CDate date2 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
149                                    date2_c.year, date2_c.month, date2_c.day,
150                                    date2_c.hour, date2_c.minute, date2_c.second);
151    return (date1 > date2);
152  }
153
154  bool cxios_date_ge(cxios_date date1_c, cxios_date date2_c)
155  {
156    xios::CDate date1 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
157                                    date1_c.year, date1_c.month, date1_c.day,
158                                    date1_c.hour, date1_c.minute, date1_c.second);
159    xios::CDate date2 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
160                                    date2_c.year, date2_c.month, date2_c.day,
161                                    date2_c.hour, date2_c.minute, date2_c.second);
162    return (date1 >= date2);
163  }
164
165  int cxios_date_get_second_of_year(cxios_date date_c)
166  {
167    xios::CDate date = xios::CDate(getCalendar("int cxios_date_get_second_of_year(cxios_date date_c)"),
168                                   date_c.year, date_c.month, date_c.day,
169                                   date_c.hour, date_c.minute, date_c.second);
170    return date.getSecondOfYear();
171  }
172
173  double cxios_date_get_day_of_year(cxios_date date_c)
174  {
175    xios::CDate date = xios::CDate(getCalendar("int cxios_date_get_day_of_year(cxios_date date_c)"),
176                                   date_c.year, date_c.month, date_c.day,
177                                   date_c.hour, date_c.minute, date_c.second);
178    return date.getDayOfYear();
179  }
180
181  double cxios_date_get_fraction_of_year(cxios_date date_c)
182  {
183    xios::CDate date = xios::CDate(getCalendar("int cxios_date_get_fraction_of_year(cxios_date date_c)"),
184                                   date_c.year, date_c.month, date_c.day,
185                                   date_c.hour, date_c.minute, date_c.second);
186    return date.getFractionOfYear();
187  }
188
189  int cxios_date_get_second_of_day(cxios_date date_c)
190  {
191    xios::CDate date = xios::CDate(getCalendar("int cxios_date_get_second_of_day(cxios_date date_c)"),
192                                   date_c.year, date_c.month, date_c.day,
193                                   date_c.hour, date_c.minute, date_c.second);
194    return date.getSecondOfDay();
195  }
196
197  double cxios_date_get_fraction_of_day(cxios_date date_c)
198  {
199    xios::CDate date = xios::CDate(getCalendar("int cxios_date_get_fraction_of_day(cxios_date date_c)"),
200                                   date_c.year, date_c.month, date_c.day,
201                                   date_c.hour, date_c.minute, date_c.second);
202    return date.getFractionOfDay();
203  }
204} // extern "C"
Note: See TracBrowser for help on using the repository browser.