templates.includes.convert_utils.body.vm Maven / Gradle / Ivy
#parse("${include}/webclient.gsoap.include.vm")
#init_qualifier($source_type)
#if( $source_type == "cpp" )
\#include "convert_utils.h"
\#include
#else
#pragma once
#INCLUDE_REFCLASS()
\#include "${gsoapHelper.stubPrefix}H.h"
\#include "assert_macros.h"
#end
#if( $source_type != "cpp" )
/**
* 实现 webservice 所有引用类型与gsoap stub 类型的相互转换的函数族
* $GENERAED_BY
*/
#end
namespace net
{
namespace gdface
{
namespace utils
{
#if( $source_type != "cpp" )
#USING_REFCLASSES(" ")
#end
#foreach( $refClass in $refClasses)
## 引用类型(java)对应的gsoap stub类型(String)
#set( $stubClass = $referenceClassMap[$refClass] )
## convert函数返回类型(String)
#set($returnType=$refClass.simpleName)
#if(!$TOOL.isException($refClass))
## 非异常类型返回shared_ptr指针
#set($returnType="std::shared_ptr<$returnType>")
#end
## 向上转换函数 stub 对象---> 引用对象
// $stubClass* 转为$returnType
// 如果_dst不为nullptr,则会修改_dst内容
#if($TOOL.isException($refClass))
// _src为nullptr时抛出std::invalid_argument异常
#else
// _src为nullptr时返回nullptr且不会修改_dst
#end
$!INLINE$returnType convert($stubClass * _src,const $returnType& _dst#if( $source_type != "cpp" ) = $returnType()#end)#if( $source_type == "h" );
#else{
#if($TOOL.isException($refClass))
## 异常类型不允许_src为nullptr
throw_if_null(_src)
throw_if_null(_src->soap)
auto ptr = *soap_faultstring(_src->soap);
// 从_dst中获取抛出异常代码的位置信息
auto at=_dst.what()?std::string(_dst.what()).append(":"):std::string("");
$refClass.simpleName _obj(at.append(ptr?ptr:"unknown"));
#else
if(nullptr == _src)return nullptr;
$refClass.simpleName _obj;
#end
#set( $stubProperties = $TOOL.sortBy($stubClassProppertiesMap[$stubClass].entrySet(),"key"))
##set($stubProp = $gsoapHelper.getStubPropertyDefine($stubClass,$propertyDescriptor.name))
## stubProp:gsoap stub类属性信息(java.util.Map.Entry) key : 属性名,value 属性类型
#foreach( $stubProp in $stubProperties)
#set($propertyDescriptor=$gsoapHelper.getPropertyDescriptor($refClass,$stubProp.key))
## 引用类型中的属性类型(java.lang.Class)
#set($propClass=$gsoapHelper.getClassOfProperty($propertyDescriptor))
#if($propClass.primitive||$TOOL.isString($propClass))
if(nullptr != _src->$stubProp.key)
_obj.${propertyDescriptor.writeMethod.name}(*_src->$stubProp.key);
#else
_obj.${propertyDescriptor.writeMethod.name}(convert(_src->$stubProp.key,decltype(_obj.${propertyDescriptor.readMethod.name}())()));
#end
#end ## end of foreach
#if($TOOL.isException($refClass))
return _obj;
#else
## 非异常类型返回shared_ptr指针
auto &ret=const_cast<$returnType&>(_dst);
ret=std::make_shared<$refClass.simpleName>(std::move(_obj));
return ret;
#end
}
#end## convert函数结束
#if(!$TOOL.isException($refClass))
## 向下转换函数 引用对象-->stub 对象
## 异常类没有向下转换函数
// std::shared_ptr<$refClass.simpleName>转为$stubClass 指针
// _src为nullptr时返回nullptr且不会修改_dst
// 如果_dst不为nullptr,则会修改_dst内容,所以请确保原_dst为空
// 返回的指针内存由gsoap管理,不要主动释放
// 返回的指针不能在_src生命期外使用
$!INLINE$stubClass* convert(struct soap& _soap, const std::shared_ptr<$refClass.simpleName>& _src,$stubClass * _dst#if( $source_type != "cpp" ) = nullptr#end)#if( $source_type == "h" );
#else{
if(nullptr == _src)return nullptr;
$stubClass *ret=nullptr != _dst?_dst:soap_new_$stubClass(&_soap);
// 内存分配失败抛出std::runtime_error异常
throw_except_if_msg(std::runtime_error,nullptr==ret,"fail to malloc by gsoap function:soap_new_$stubClass(struct soap *soap, int n = -1)")
ret->soap_default(&_soap);
#set( $stubProperties = $TOOL.sortBy($stubClassProppertiesMap[$stubClass].entrySet(),"key"))
##set($stubProp = $gsoapHelper.getStubPropertyDefine($stubClass,$propertyDescriptor.name))
## stubProp:gsoap stub类属性信息(java.util.Map.Entry) key : 属性名,value 属性类型
#foreach( $stubProp in $stubProperties)
#set($propertyDescriptor=$gsoapHelper.getPropertyDescriptor($refClass,$stubProp.key))
## 引用类型中的属性类型(java.lang.Class)
#set($propClass=$gsoapHelper.getClassOfProperty($propertyDescriptor))
#if($propClass.primitive||$TOOL.isString($propClass))
ret->$stubProp.key=std::addressof(_src->${propertyDescriptor.readMethod.name}Ref());
#elseif($gsoapHelper.isPointer($stubProp.value))
ret->$stubProp.key=convert(_soap,_src->${propertyDescriptor.readMethod.name}());
#else
## std::vector类型
ret->$stubProp.key=convert(_soap,_src->${propertyDescriptor.readMethod.name}(),decltype(ret->$stubProp.key)());
#end
#end ## end of foreach
return ret;
}
#end## convert函数结束
#end
#end
#if( $source_type != "cpp" )
// xsd__base64Binary* 转为std::shared_ptr>
// _dst为左值引用时会修改左值
inline std::shared_ptr> convert(xsd__base64Binary *_src,const std::shared_ptr> _dst=std::shared_ptr>()){
auto &_ret=const_cast>&>(_dst);
_ret= nullptr != _src? std::make_shared>(std::vector(_src->__ptr,_src->__ptr+_src->__size)):nullptr;
return _ret;
}
// std::shared_ptr>转为xsd__base64Binary*
// 如果_dst不为nullptr,则会修改_dst内容,所以请确保原_dst为空
// 返回的指针内存由gsoap管理,不要主动释放
// _src为nullptr时返回nullptr且不会修改_dst
inline xsd__base64Binary * convert(struct soap& _soap,const std::shared_ptr> &_src,xsd__base64Binary *_dst=nullptr){
if(nullptr==_src)return nullptr;
// 如果_dst为nullptr,则分配内存
xsd__base64Binary *ret=_dst?_dst:soap_new_xsd__base64Binary(&_soap);
if(nullptr != ret){
ret->soap_default(&_soap);
ret->__ptr=decltype(xsd__base64Binary::__ptr)(_src->data());
ret->__size=decltype(xsd__base64Binary::__size)(_src->size());
}
return ret;
}
// std::vector类型向上转换函数模板,SRC为原类型,DST为目标类型
// 对只有一个元素且为nullptr的_src数组当做空数组
// _dst为左值引用时会修改左值
template
inline std::vector> convert(std::vector&_src,const std::vector>& _dst=std::vector>()){
auto &ret=const_cast>&>(_dst);
if(1==_src.size()&&nullptr==_src[0]){
ret=std::vector>();
}else{
ret=std::vector>(_src.size());
for(size_t i=0,end_i=_src.size();i());
}
}
return ret;
}
// std::vector类型向下转换函数模板,SRC为原类型,DST为目标类型
// _dst为左值引用时会修改左值
// 返回的std::vector不能在_src生命期外使用
template
inline std::vector convert(struct soap& _soap,const std::vector>& _src,const std::vector&_dst=std::vector()){
auto &ret=const_cast&>(_dst);
ret=std::vector(_src.size());
for(size_t i=0,end_i=_src.size();i
inline std::vector convert(const std::vector& _src, const std::vector&_dst = std::vector()) {
auto &ret = const_cast&>(_dst);
ret = _src;
return ret;
}
// std::vector类型向下转换函数模板,源类型与目标类型一致
// _dst为左值引用时会修改左值
template
inline std::vector convert(struct soap& _soap, const std::vector& _src, const std::vector&_dst = std::vector()) {
auto &ret = const_cast&>(_dst);
ret = _src;
return ret;
}
##普通类型数据转换函数
// 指针类型向上转换为std::shared_ptr的函数模板
// _src为nullptr时返回nullptr
// _dst为左值引用时会修改左值
template
inline std::shared_ptr convert(T *_src,const std::shared_ptr&_dst=std::shared_ptr()){
auto &ret=const_cast&>(_dst);
ret = nullptr != _src?std::make_shared(*_src):nullptr;
return ret;
}
// std::shared_ptr类型向下转换为指针函数模板
// _dst不为nullptr时会将_srcr的值赋值给_dst,返回_dst
// _dst为nullptr时直接返回_src指针,所以返回的指针不能在_src生命期外使用
template
inline T* convert(struct soap& _soap,const std::shared_ptr&_src,T *_dst=nullptr)noexcept{
return (nullptr != _dst&&nullptr != _src)? *_dst=*_src,_dst:_src.get();
}
#end
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy