source: XIOS/trunk/src/generate_interface_impl.hpp @ 335

Last change on this file since 335 was 335, checked in by ymipsl, 12 years ago

Change namespace xmlioserver -> xios

YM

File size: 23.6 KB
Line 
1#ifndef __XIOS_GENERATE_INTERFACE_IMPL_HPP__
2#define __XIOS_GENERATE_INTERFACE_IMPL_HPP__
3
4#include "xmlioserver_spl.hpp"
5#include "generate_interface.hpp"
6#include "type_util.hpp"
7#include "indent.hpp"
8
9namespace xios
10{ 
11
12
13// /////////////////////////////////////////////////
14// //                 C Interface                 //
15// /////////////////////////////////////////////////
16
17  template <class T>
18  void CInterface::AttributeCInterface(ostream& oss, const string& className,const string& name)
19  {
20    string typeName=getStrType<T>() ;
21 
22    oss<<"void cxios_set_"<<className<<"_"<<name<<"("<<className<<"_Ptr "<<className<<"_hdl, "<< typeName<<" "<<name<<")"<<iendl ;
23    oss<<"{"<<iendl ;
24    oss<<"  "<<className<<"_hdl->"<<name<<".setValue("<<name<<");"<<iendl ;
25    oss<<"  "<<className<<"_hdl->sendAttributToServer("<<className<<"_hdl->"<<name<<");"<<iendl ;
26    oss<<"}"<<iendl ;
27   
28    oss<<iendl ;
29    oss<<"void cxios_get_"<<className<<"_"<<name<<"("<<className<<"_Ptr "<<className<<"_hdl, "<< typeName<<"* "<<name<<")"<<iendl ;
30    oss<<"{"<<iendl;
31    oss<<"  *"<<name<<" = "<<className<<"_hdl->"<<name<<".getValue();"<<iendl ;
32    oss<<"}"<<iendl ;
33  }
34   
35 
36  template<>
37  void CInterface::AttributeCInterface<string>(ostream& oss, const string& className,const string& name) 
38  {
39    oss<<"void cxios_set_"<<className<<"_"<<name<<"("<<className<<"_Ptr "<<className<<"_hdl, const char * "<<name<<", int "<<name<<"_size)"<<iendl ;
40    oss<<"{"<<iendl ;
41    oss<<"  std::string "<<name<<"_str;"<<iendl;
42    oss<<"  if(!cstr2string("<<name<<", "<<name<<"_size, "<<name<<"_str)) return;"<<iendl ;
43    oss<<"  "<<className<<"_hdl->"<<name<<".setValue("<<name<<"_str);"<<iendl ;
44    oss<<"  "<<className<<"_hdl->sendAttributToServer("<<className<<"_hdl->"<<name<<");"<<iendl ;
45    oss<<"}"<<iendl ;
46   
47    oss<<iendl ;
48   
49    oss<<"void cxios_get_"<<className<<"_"<<name<<"("<<className<<"_Ptr "<<className<<"_hdl, char * "<<name<<", int "<<name<<"_size)"<<iendl ;
50    oss<<"{"<<iendl ;
51    oss<<"  if(!string_copy("<<className<<"_hdl->"<<name<<".getValue(),"<<name<<" , "<<name<<"_size))"<<iendl ;
52    oss<<"    ERROR(\"void cxios_get_"<<className<<"_"<<name<<"("<<className<<"_Ptr "<<className<<"_hdl, char * "<<name<<", int "
53       <<name<<"_size)\", <<\"Input string is to short\");"<<iendl ;
54
55    oss<<"}"<<iendl ;
56 
57  }
58
59//     if (!array_copy(domain_hdl->mask.getValue(), mask, extent1, extent2))
60//        ERROR("cxios_get_domain_mask(XDomainPtr domain_hdl, bool * mask, int extent1, int extent2)",<<"Output array size is not conform to array size attribut") ;
61
62
63#define macro(T) \
64  template <>\
65  void CInterface::AttributeCInterface<ARRAY(T,1)>(ostream& oss, const string& className,const string& name)\
66  {\
67    string typeName=getStrType<T>() ;\
68\
69    oss<<"void cxios_set_"<<className<<"_"<<name<<"("<<className<<"_Ptr "<<className<<"_hdl, "<< typeName<<"* "<<name<<", int extent1)"<<iendl ;\
70    oss<<"{"<<iendl ;\
71    oss<<"  ARRAY("<<typeName<<",1) array_tmp(new CArray<"<<typeName<<",1>(boost::extents[extent1]));"<<iendl ;\
72    oss<<"  std::copy("<<name<<", &("<<name<<"[array_tmp->num_elements()]), array_tmp->data());"<<iendl ;\
73    oss<<"  "<<className<<"_hdl->"<<name<<".setValue(array_tmp);"<<iendl ;\
74    oss<<"  "<<className<<"_hdl->sendAttributToServer("<<className<<"_hdl->"<<name<<");"<<iendl ;\
75    oss<<"}"<<iendl ;\
76    oss<<iendl; \
77    oss<<"void cxios_get_"<<className<<"_"<<name<<"("<<className<<"_Ptr "<<className<<"_hdl, "<< typeName<<"* "<<name<<", int extent1)"<<iendl ;\
78    oss<<"{"<<iendl; \
79    oss<<"  if (!array_copy("<<className<<"_hdl->"<<name<<".getValue(), "<<name<<", extent1))"<<iendl ; \
80    oss<<"   ERROR(\"void cxios_set_"<<className<<"_"<<name<<"("<<className<<"_Ptr "<<className<<"_hdl, "<< typeName<<"* "<<name<<", int extent1)\",<<" \
81       <<"\"Output array size is not conform to array size attribute\") ;"<<iendl; \
82    oss<<"}"<<iendl ;\
83  }\
84\
85  template <> \
86  void CInterface::AttributeCInterface<ARRAY(T,2)>(ostream& oss, const string& className,const string& name)\
87  {\
88    string typeName=getStrType<T>() ;\
89\
90    oss<<"void cxios_set_"<<className<<"_"<<name<<"("<<className<<"_Ptr "<<className<<"_hdl, "<< typeName<<"* "<<name<<", int extent1, int extent2)"<<iendl ;\
91    oss<<"{"<<iendl ;\
92    oss<<"  ARRAY("<<typeName<<",2) array_tmp(new CArray<"<<typeName<<",2>(boost::extents[extent1][extent2]));"<<iendl ;\
93    oss<<"  std::copy("<<name<<", &("<<name<<"[array_tmp->num_elements()]), array_tmp->data());"<<iendl ;\
94    oss<<"  "<<className<<"_hdl->"<<name<<".setValue(array_tmp);"<<iendl ;\
95    oss<<"  "<<className<<"_hdl->sendAttributToServer("<<className<<"_hdl->"<<name<<");"<<iendl ;\
96    oss<<"}"<<iendl ;\
97    oss<<iendl; \
98    oss<<"void cxios_get_"<<className<<"_"<<name<<"("<<className<<"_Ptr "<<className<<"_hdl, "<< typeName<<"* "<<name<<", int extent1, int extent2)"<<iendl ;\
99    oss<<"{"<<iendl; \
100    oss<<"  if (!array_copy("<<className<<"_hdl->"<<name<<".getValue(), "<<name<<", extent1, extent2))"<<iendl ; \
101    oss<<"   ERROR(\"void cxios_set_"<<className<<"_"<<name<<"("<<className<<"_Ptr "<<className<<"_hdl, "<< typeName<<"* "<<name<<", int extent1, int extent2)\",<<" \
102       <<"\"Output array size is not conform to array size attribute\") ;"<<iendl; \
103    oss<<"}"<<iendl ;\
104  }\
105\
106  template <>\
107  void CInterface::AttributeCInterface<ARRAY(T,3)>(ostream& oss, const string& className,const string& name)\
108  {\
109    string typeName=getStrType<T>() ;\
110\
111    oss<<"void cxios_set_"<<className<<"_"<<name<<"("<<className<<"_Ptr "<<className<<"_hdl, "<< typeName<<"* "<<name<<", int extent1, int extent2, int extent3)"<<iendl ;\
112    oss<<"{"<<iendl ;\
113    oss<<"  ARRAY("<<typeName<<",3) array_tmp(new CArray<"<<typeName<<",3>(boost::extents[extent1][extent2][extent3]));"<<iendl ;\
114    oss<<"  std::copy("<<name<<", &("<<name<<"[array_tmp->num_elements()]), array_tmp->data());"<<iendl ;\
115    oss<<"  "<<className<<"_hdl->"<<name<<".setValue(array_tmp);"<<iendl ;\
116    oss<<"  "<<className<<"_hdl->sendAttributToServer("<<className<<"_hdl->"<<name<<");"<<iendl ;\
117    oss<<"}"<<iendl ;\
118    oss<<iendl; \
119    oss<<"void cxios_get_"<<className<<"_"<<name<<"("<<className<<"_Ptr "<<className<<"_hdl, "<< typeName<<"* "<<name<<", int extent1, int extent2, int extent3)"<<iendl ;\
120    oss<<"{"<<iendl; \
121    oss<<"  if (!array_copy("<<className<<"_hdl->"<<name<<".getValue(), "<<name<<", extent1))"<<iendl ; \
122    oss<<"   ERROR(\"void cxios_set_"<<className<<"_"<<name<<"("<<className<<"_Ptr "<<className<<"_hdl, "<< typeName<<"* "<<name<<", int extent1, int extent2, int extent3)\",<<" \
123       <<"\"Output array size is not conform to array size attribute\") ;"<<iendl; \
124    oss<<"}"<<iendl ;\
125  }
126
127macro(bool)
128macro(double)
129macro(int)
130
131#undef macro 
132
133// /////////////////////////////////////////////////
134// //          Fortran 2003 Interface             //
135// /////////////////////////////////////////////////
136
137   template <class T>
138   void CInterface::AttributeFortran2003Interface(ostream& oss,const string& className,const string& name)
139   {
140     string fortranType=getStrFortranType<T>() ;
141     string fortranKindC=getStrFortranKindC<T>() ;
142     
143     oss<<"SUBROUTINE cxios_set_"<<className<<"_"<<name<<"("<<className<<"_hdl, "<<name<<") BIND(C)"<<iendl ;
144     oss<<"  USE ISO_C_BINDING"<<iendl ;
145     oss<<"  INTEGER (kind = C_INTPTR_T), VALUE :: "<<className<<"_hdl"<<iendl ;
146     oss<<"  "<<fortranType<<" "<<fortranKindC<<"      , VALUE :: "<<name<<iendl ;
147     oss<<"END SUBROUTINE cxios_set_"<<className<<"_"<<name<<iendl ;
148     oss<<iendl ; \
149     oss<<"SUBROUTINE cxios_get_"<<className<<"_"<<name<<"("<<className<<"_hdl, "<<name<<") BIND(C)"<<iendl ;
150     oss<<"  USE ISO_C_BINDING"<<iendl ;
151     oss<<"  INTEGER (kind = C_INTPTR_T), VALUE :: "<<className<<"_hdl"<<iendl ;
152     oss<<"  "<<fortranType<<" "<<fortranKindC<<"             :: "<<name<<iendl ;
153     oss<<"END SUBROUTINE cxios_get_"<<className<<"_"<<name<<iendl ;
154   }
155   
156   
157   template <>
158   void CInterface::AttributeFortran2003Interface<string>(ostream& oss,const string& className,const string& name)
159   {
160         
161     oss<<"SUBROUTINE cxios_set_"<<className<<"_"<<name<<"("<<className<<"_hdl, "<<name<<", "<<name<<"_size) BIND(C)"<<iendl ;
162     oss<<"  USE ISO_C_BINDING"<<iendl ;
163     oss<<"  INTEGER (kind = C_INTPTR_T), VALUE :: "<<className<<"_hdl"<<iendl ;
164     oss<<"  CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: "<<name<<iendl ;
165     oss<<"  INTEGER  (kind = C_INT)     , VALUE        :: "<<name<<"_size"<<iendl ;
166     oss<<"END SUBROUTINE cxios_set_"<<className<<"_"<<name<<iendl ;
167     oss<<iendl ; 
168     oss<<"SUBROUTINE cxios_get_"<<className<<"_"<<name<<"("<<className<<"_hdl, "<<name<<", "<<name<<"_size) BIND(C)"<<iendl ;
169     oss<<"  USE ISO_C_BINDING"<<iendl ;
170     oss<<"  INTEGER (kind = C_INTPTR_T), VALUE :: "<<className<<"_hdl"<<iendl ;
171     oss<<"  CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: "<<name<<iendl ;
172     oss<<"  INTEGER  (kind = C_INT)     , VALUE        :: "<<name<<"_size"<<iendl ;
173     oss<<"END SUBROUTINE cxios_get_"<<className<<"_"<<name<<iendl ;
174     
175   }
176   
177#define macro(T)\     
178   template <>\
179   void CInterface::AttributeFortran2003Interface<ARRAY(T,1)>(ostream& oss,const string& className,const string& name) \
180   { \
181     string fortranType=getStrFortranType<T>() ; \
182     string fortranKindC=getStrFortranKindC<T>() ; \
183      \
184     oss<<"SUBROUTINE cxios_set_"<<className<<"_"<<name<<"("<<className<<"_hdl, "<<name<<", extent1) BIND(C)"<<iendl ; \
185     oss<<"  USE ISO_C_BINDING"<<iendl ; \
186     oss<<"  INTEGER (kind = C_INTPTR_T), VALUE       :: "<<className<<"_hdl"<<iendl ; \
187     oss<<"  "<<fortranType<<" "<<fortranKindC<<"     , DIMENSION(*) :: "<<name<<iendl ; \
188     oss<<"  INTEGER (kind = C_INT), VALUE  :: extent1"<<iendl ; \
189     oss<<"END SUBROUTINE cxios_set_"<<className<<"_"<<name<<iendl ; \
190     oss<<iendl; \
191     oss<<"SUBROUTINE cxios_get_"<<className<<"_"<<name<<"("<<className<<"_hdl, "<<name<<", extent1) BIND(C)"<<iendl ; \
192     oss<<"  USE ISO_C_BINDING"<<iendl ; \
193     oss<<"  INTEGER (kind = C_INTPTR_T), VALUE       :: "<<className<<"_hdl"<<iendl ; \
194     oss<<"  "<<fortranType<<" "<<fortranKindC<<"     , DIMENSION(*) :: "<<name<<iendl ; \
195     oss<<"  INTEGER (kind = C_INT), VALUE  :: extent1"<<iendl ; \
196     oss<<"END SUBROUTINE cxios_get_"<<className<<"_"<<name<<iendl ; \
197   } \
198 \
199   template <> \
200   void CInterface::AttributeFortran2003Interface<ARRAY(T,2)>(ostream& oss,const string& className,const string& name) \
201   { \
202     string fortranType=getStrFortranType<T>() ; \
203     string fortranKindC=getStrFortranKindC<T>() ; \
204      \
205     oss<<"SUBROUTINE cxios_set_"<<className<<"_"<<name<<"("<<className<<"_hdl, "<<name<<", extent1, extent2) BIND(C)"<<iendl ; \
206     oss<<"  USE ISO_C_BINDING"<<iendl ; \
207     oss<<"  INTEGER (kind = C_INTPTR_T), VALUE       :: "<<className<<"_hdl"<<iendl ; \
208     oss<<"  "<<fortranType<<" "<<fortranKindC<<"     , DIMENSION(*) :: "<<name<<iendl ; \
209     oss<<"  INTEGER (kind = C_INT), VALUE  :: extent1"<<iendl ; \
210     oss<<"  INTEGER (kind = C_INT), VALUE  :: extent2"<<iendl ; \
211     oss<<"END SUBROUTINE cxios_set_"<<className<<"_"<<name<<iendl ; \
212     oss<<iendl ; \
213     oss<<"SUBROUTINE cxios_get_"<<className<<"_"<<name<<"("<<className<<"_hdl, "<<name<<", extent1, extent2) BIND(C)"<<iendl ; \
214     oss<<"  USE ISO_C_BINDING"<<iendl ; \
215     oss<<"  INTEGER (kind = C_INTPTR_T), VALUE       :: "<<className<<"_hdl"<<iendl ; \
216     oss<<"  "<<fortranType<<" "<<fortranKindC<<"     , DIMENSION(*) :: "<<name<<iendl ; \
217     oss<<"  INTEGER (kind = C_INT), VALUE  :: extent1"<<iendl ; \
218     oss<<"  INTEGER (kind = C_INT), VALUE  :: extent2"<<iendl ; \
219     oss<<"END SUBROUTINE cxios_get_"<<className<<"_"<<name<<iendl ; \
220   } \
221     \
222   template <> \
223   void CInterface::AttributeFortran2003Interface<ARRAY(T,3)>(ostream& oss,const string& className,const string& name) \
224   { \
225     string fortranType=getStrFortranType<T>() ; \
226     string fortranKindC=getStrFortranKindC<T>() ; \
227      \
228     oss<<"SUBROUTINE cxios_set_"<<className<<"_"<<name<<"("<<className<<"_hdl, "<<name<<", extent1, extent2, extent3) BIND(C)"<<iendl ; \
229     oss<<"  USE ISO_C_BINDING"<<iendl ; \
230     oss<<"  INTEGER (kind = C_INTPTR_T), VALUE       :: "<<className<<"_hdl"<<iendl ; \
231     oss<<"  "<<fortranType<<" "<<fortranKindC<<"     , DIMENSION(*) :: "<<name<<iendl ; \
232     oss<<"  INTEGER (kind = C_INT), VALUE  :: extent1"<<iendl ; \
233     oss<<"  INTEGER (kind = C_INT), VALUE  :: extent2"<<iendl ; \
234     oss<<"  INTEGER (kind = C_INT), VALUE  :: extent3"<<iendl ; \
235     oss<<"END SUBROUTINE cxios_set_"<<className<<"_"<<name<<iendl ; \
236     oss<<iendl ;\
237     oss<<"SUBROUTINE cxios_get_"<<className<<"_"<<name<<"("<<className<<"_hdl, "<<name<<", extent1, extent2, extent3) BIND(C)"<<iendl ; \
238     oss<<"  USE ISO_C_BINDING"<<iendl ; \
239     oss<<"  INTEGER (kind = C_INTPTR_T), VALUE       :: "<<className<<"_hdl"<<iendl ; \
240     oss<<"  "<<fortranType<<" "<<fortranKindC<<"     , DIMENSION(*) :: "<<name<<iendl ; \
241     oss<<"  INTEGER (kind = C_INT), VALUE  :: extent1"<<iendl ; \
242     oss<<"  INTEGER (kind = C_INT), VALUE  :: extent2"<<iendl ; \
243     oss<<"  INTEGER (kind = C_INT), VALUE  :: extent3"<<iendl ; \
244     oss<<"END SUBROUTINE cxios_get_"<<className<<"_"<<name<<iendl ; \
245   }
246 
247  macro(bool)
248  macro(double)
249  macro(int)
250 
251  #undef macro
252 
253   template <class T>
254   void CInterface::AttributeFortranInterfaceDeclaration(ostream& oss,const string& className,const string& name)
255   {
256     oss<<getStrFortranType<T>()<<" "<< getStrFortranKind<T>() <<" , OPTIONAL, INTENT(IN) :: "<<name<<iendl ;
257     if (!matchingTypeCFortran<T>()) oss<<getStrFortranType<T>()<<" "<<getStrFortranKindC<T>()<<" :: "<<name<<"_tmp"<<iendl ;
258   }
259
260   template <class T>
261   void CInterface::AttributeFortranInterfaceGetDeclaration(ostream& oss,const string& className,const string& name)
262   {
263     oss<<getStrFortranType<T>()<<" "<< getStrFortranKind<T>() <<" , OPTIONAL, INTENT(OUT) :: "<<name<<iendl ;
264     if (!matchingTypeCFortran<T>()) oss<<getStrFortranType<T>()<<" "<<getStrFortranKindC<T>()<<" :: "<<name<<"_tmp"<<iendl ;
265   }
266 
267   template <>
268   void CInterface::AttributeFortranInterfaceDeclaration<string>(ostream& oss,const string& className,const string& name)
269   {
270     oss<<"CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: "<<name<<iendl ;
271   }
272   
273   template <>
274   void CInterface::AttributeFortranInterfaceGetDeclaration<string>(ostream& oss,const string& className,const string& name)
275   {
276     oss<<"CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: "<<name<<iendl ;
277   }
278
279#define macro(T)\   
280   template <> \
281   void CInterface::AttributeFortranInterfaceDeclaration<ARRAY(T,1)>(ostream& oss,const string& className,const string& name) \
282   { \
283     oss<<getStrFortranType<T>()<<" "<<getStrFortranKind<T>() <<" , OPTIONAL, INTENT(IN) :: "<<name<<"(:)"<<iendl ; \
284     if (!matchingTypeCFortran<T>()) oss<<getStrFortranType<T>()<<" "<<getStrFortranKindC<T>() <<" , ALLOCATABLE :: "<<name<<"_tmp(:)"<<iendl ; \
285   } \
286   template <> \
287   void CInterface::AttributeFortranInterfaceGetDeclaration<ARRAY(T,1)>(ostream& oss,const string& className,const string& name) \
288   { \
289     oss<<getStrFortranType<T>()<<" "<<getStrFortranKind<T>() <<" , OPTIONAL, INTENT(OUT) :: "<<name<<"(:)"<<iendl ; \
290     if (!matchingTypeCFortran<T>()) oss<<getStrFortranType<T>()<<" "<<getStrFortranKindC<T>() <<" , ALLOCATABLE :: "<<name<<"_tmp(:)"<<iendl ; \
291   } \
292 \
293   template <> \
294   void CInterface::AttributeFortranInterfaceDeclaration<ARRAY(T,2)>(ostream& oss,const string& className,const string& name) \
295   { \
296     oss<<getStrFortranType<T>()<<" "<<getStrFortranKind<T>() <<" , OPTIONAL, INTENT(IN) :: "<<name<<"(:,:)"<<iendl ; \
297     if (!matchingTypeCFortran<T>()) oss<<getStrFortranType<T>()<<" "<<getStrFortranKindC<T>() <<" , ALLOCATABLE :: "<<name<<"_tmp(:,:)"<<iendl ; \
298   } \
299 \
300   template <> \
301   void CInterface::AttributeFortranInterfaceGetDeclaration<ARRAY(T,2)>(ostream& oss,const string& className,const string& name) \
302   { \
303     oss<<getStrFortranType<T>()<<" "<<getStrFortranKind<T>() <<" , OPTIONAL, INTENT(OUT) :: "<<name<<"(:,:)"<<iendl ; \
304     if (!matchingTypeCFortran<T>()) oss<<getStrFortranType<T>()<<" "<<getStrFortranKindC<T>() <<" , ALLOCATABLE :: "<<name<<"_tmp(:,:)"<<iendl ; \
305   } \
306 \
307   template <> \
308   void CInterface::AttributeFortranInterfaceDeclaration<ARRAY(T,3)>(ostream& oss,const string& className,const string& name) \
309   { \
310     oss<<getStrFortranType<T>()<<" "<<getStrFortranKind<T>() <<" , OPTIONAL, INTENT(IN) :: "<<name<<"(:,:,:)"<<iendl ; \
311     if (!matchingTypeCFortran<T>()) oss<<getStrFortranType<T>()<<" "<<getStrFortranKindC<T>() <<" , ALLOCATABLE :: "<<name<<"_tmp(:,:,:)"<<iendl ; \
312   }\
313 \
314   template <> \
315   void CInterface::AttributeFortranInterfaceGetDeclaration<ARRAY(T,3)>(ostream& oss,const string& className,const string& name) \
316   { \
317     oss<<getStrFortranType<T>()<<" "<<getStrFortranKind<T>() <<" , OPTIONAL, INTENT(OUT) :: "<<name<<"(:,:,:)"<<iendl ; \
318     if (!matchingTypeCFortran<T>()) oss<<getStrFortranType<T>()<<" "<<getStrFortranKindC<T>() <<" , ALLOCATABLE :: "<<name<<"_tmp(:,:,:)"<<iendl ; \
319   }     
320   
321  macro(bool)
322  macro(double)
323  macro(int)
324
325#undef macro
326
327   
328   template <class T>
329   void CInterface::AttributeFortranInterfaceBody(ostream& oss,const string& className,const string& name)
330   {
331     string name_tmp=name+"__tmp" ;
332     
333     oss<<"IF (PRESENT("<<name<<"_)) THEN"<<iendl ;
334     if (!matchingTypeCFortran<T>()) 
335     {
336       oss<<"  "<<name_tmp<<"="<<name<<"_"<<iendl ;
337       oss<<"  CALL cxios_set_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name_tmp<<")"<<iendl ;
338     }
339     else oss<<"  CALL cxios_set_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name<<"_)"<<iendl ;
340     oss<<"ENDIF"<<iendl ;
341   }
342   
343   template <class T>
344   void CInterface::AttributeFortranInterfaceGetBody(ostream& oss,const string& className,const string& name)
345   {
346     string name_tmp=name+"__tmp" ;
347     
348     oss<<"IF (PRESENT("<<name<<"_)) THEN"<<iendl ;
349     if (!matchingTypeCFortran<T>()) 
350     {
351       oss<<"  CALL cxios_get_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name_tmp<<")"<<iendl ;
352       oss<<"  "<<name<<"_="<<name_tmp<<iendl ;
353     }
354     else oss<<"  CALL cxios_get_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name<<"_)"<<iendl ;
355     oss<<"ENDIF"<<iendl ;
356   }
357 
358   template <>
359   void CInterface::AttributeFortranInterfaceBody<string>(ostream& oss,const string& className,const string& name)
360   {
361      oss<<"IF (PRESENT("<<name<<"_)) THEN"<<iendl ;
362      oss<<"  CALL cxios_set_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name<<"_, len("<<name<<"_))"<<iendl ;
363      oss<<"ENDIF"<<iendl ;
364   }
365
366   template <>
367   void CInterface::AttributeFortranInterfaceGetBody<string>(ostream& oss,const string& className,const string& name)
368   {
369      oss<<"IF (PRESENT("<<name<<"_)) THEN"<<iendl ;
370      oss<<"  CALL cxios_get_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name<<"_, len("<<name<<"_))"<<iendl ;
371      oss<<"ENDIF"<<iendl ;
372   }
373
374
375#define macro(T) \
376   template <>  \
377   void CInterface::AttributeFortranInterfaceBody< ARRAY(T,1) >(ostream& oss,const string& className,const string& name) \
378   {  \
379     string name_tmp=name+"__tmp" ; \
380      \
381     oss<<"IF (PRESENT("<<name<<"_)) THEN"<<iendl ; \
382     if (!matchingTypeCFortran<T>())  \
383     { \
384       oss<<"  ALLOCATE("<<name_tmp<<"(size("<<name<<"_,1)))"<<iendl ; \
385       oss<<"  "<<name_tmp<<"="<<name<<"_"<<iendl ; \
386       oss<<"  CALL cxios_set_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name_tmp<<",size("<<name<<"_,1))"<<iendl ; \
387     } \
388     else oss<<"  CALL cxios_set_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name<<"_,size("<<name<<"_,1))"<<iendl ; \
389     oss<<"ENDIF"<<iendl ; \
390   } \
391 \
392   template <>  \
393   void CInterface::AttributeFortranInterfaceBody< ARRAY(T,2) >(ostream& oss,const string& className,const string& name) \
394   {  \
395     string name_tmp=name+"__tmp" ; \
396      \
397     oss<<"IF (PRESENT("<<name<<"_)) THEN"<<iendl ; \
398     if (!matchingTypeCFortran<T>())  \
399     { \
400       oss<<"  ALLOCATE("<<name_tmp<<"(size("<<name<<"_,1),size("<<name<<"_,2)))"<<iendl ; \
401       oss<<"  "<<name_tmp<<"="<<name<<"_"<<iendl ; \
402       oss<<"  CALL cxios_set_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name_tmp<<",size("<<name<<"_,1),size("<<name<<"_,2))"<<iendl ; \
403     } \
404     else oss<<"  CALL cxios_set_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name<<"_,size("<<name<<"_,1),size("<<name<<"_,2))"<<iendl ; \
405     oss<<"ENDIF"<<iendl ; \
406   } \
407    \
408   template <>  \
409   void CInterface::AttributeFortranInterfaceBody< ARRAY(T,3) >(ostream& oss,const string& className,const string& name) \
410   {  \
411     string name_tmp=name+"__tmp" ; \
412      \
413     oss<<"IF (PRESENT("<<name<<"_)) THEN"<<iendl ; \
414     if (!matchingTypeCFortran<T>())  \
415     { \
416       oss<<"  ALLOCATE("<<name_tmp<<"(size("<<name<<"_,1),size("<<name<<"_,2),size("<<name<<"_,3)))"<<iendl ; \
417       oss<<"  "<<name_tmp<<"="<<name<<"_"<<iendl ; \
418       oss<<"  CALL cxios_set_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name_tmp<<",size("<<name<<"_,1),size("<<name<<"_,2),size("<<name<<"_,3))"<<iendl ; \
419     } \
420     else oss<<"  CALL cxios_set_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name<<"_,size("<<name<<"_,1),size("<<name<<"_,2),size("<<name<<"_,3))"<<iendl ; \
421     oss<<"ENDIF"<<iendl ; \
422   }
423 
424  macro(bool)
425  macro(double)
426  macro(int)
427
428#undef macro
429
430#define macro(T) \
431   template <>  \
432   void CInterface::AttributeFortranInterfaceGetBody< ARRAY(T,1) >(ostream& oss,const string& className,const string& name) \
433   {  \
434     string name_tmp=name+"__tmp" ; \
435      \
436     oss<<"IF (PRESENT("<<name<<"_)) THEN"<<iendl ; \
437     if (!matchingTypeCFortran<T>())  \
438     { \
439       oss<<"  ALLOCATE("<<name_tmp<<"(size("<<name<<"_,1)))"<<iendl ; \
440       oss<<"  CALL cxios_get_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name_tmp<<",size("<<name<<"_,1))"<<iendl ; \
441       oss<<"  "<<name<<"_="<<name_tmp<<"_"<<iendl ; \
442     } \
443     else oss<<"  CALL cxios_get_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name<<"_,size("<<name<<"_,1))"<<iendl ; \
444     oss<<"ENDIF"<<iendl ; \
445   } \
446 \
447   template <>  \
448   void CInterface::AttributeFortranInterfaceGetBody< ARRAY(T,2) >(ostream& oss,const string& className,const string& name) \
449   {  \
450     string name_tmp=name+"__tmp" ; \
451      \
452     oss<<"IF (PRESENT("<<name<<"_)) THEN"<<iendl ; \
453     if (!matchingTypeCFortran<T>())  \
454     { \
455       oss<<"  ALLOCATE("<<name_tmp<<"(size("<<name<<"_,1),size("<<name<<"_,2)))"<<iendl ; \
456       oss<<"  CALL cxios_get_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name_tmp<<",size("<<name<<"_,1),size("<<name<<"_,2))"<<iendl ; \
457       oss<<"  "<<name<<"_="<<name_tmp<<iendl ; \
458     } \
459     else oss<<"  CALL cxios_get_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name<<"_,size("<<name<<"_,1),size("<<name<<"_,2))"<<iendl ; \
460     oss<<"ENDIF"<<iendl ; \
461   } \
462    \
463   template <>  \
464   void CInterface::AttributeFortranInterfaceGetBody< ARRAY(T,3) >(ostream& oss,const string& className,const string& name) \
465   {  \
466     string name_tmp=name+"__tmp" ; \
467      \
468     oss<<"IF (PRESENT("<<name<<"_)) THEN"<<iendl ; \
469     if (!matchingTypeCFortran<T>())  \
470     { \
471       oss<<"  ALLOCATE("<<name_tmp<<"(size("<<name<<"_,1),size("<<name<<"_,2),size("<<name<<"_,3)))"<<iendl ; \
472       oss<<"  CALL cxios_get_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name_tmp<<",size("<<name<<"_,1),size("<<name<<"_,2),size("<<name<<"_,3))"<<iendl ; \
473       oss<<"  "<<name<<"_="<<name_tmp<<iendl ; \
474      } \
475     else oss<<"  CALL cxios_get_"<<className<<"_"<<name<<"("<<className<<"_hdl%daddr, "<<name<<"_,size("<<name<<"_,1),size("<<name<<"_,2),size("<<name<<"_,3))"<<iendl ; \
476     oss<<"ENDIF"<<iendl ; \
477   }
478     
479  macro(bool)
480  macro(double)
481  macro(int)
482
483#undef macro
484}
485
486#endif
Note: See TracBrowser for help on using the repository browser.