All Downloads are FREE. Search and download functionalities are using the official Maven repository.

templates.includes.convert_utils.body.vm Maven / Gradle / Ivy

There is a newer version: 3.5.0
Show newest version
#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