DaoValue* DaoValue_CopyContainer( DaoValue *self, DaoType *tp ) { switch( self->type ){ case DAO_LIST : return (DaoValue*) DaoList_Copy( (DaoList*) self, tp ); case DAO_MAP : return (DaoValue*) DaoMap_Copy( (DaoMap*) self, tp ); case DAO_TUPLE : return (DaoValue*) DaoTuple_Copy( (DaoTuple*) self, tp ); #ifdef DAO_WITH_NUMARRAY case DAO_ARRAY : return (DaoValue*) DaoArray_Copy( (DaoArray*) self, tp ); #endif default : break; } return self; }
/* // Assumming the value "self" is compatible to the type "tp", if it is not null. */ DaoValue* DaoValue_SimpleCopyWithTypeX( DaoValue *self, DaoType *tp, DaoDataCache *cache ) { DaoEnum *e; daoint i, n; if( self == NULL ) return dao_none_value; if( (tp == NULL || tp->tid == self->type) && self->type < DAO_ENUM ){ if( cache ){ DaoValue *value = DaoDataCache_MakeValue( cache, self->type ); switch( self->type ){ case DAO_NONE : return self; case DAO_INTEGER : value->xInteger.value = self->xInteger.value; break; case DAO_FLOAT : value->xFloat.value = self->xFloat.value; break; case DAO_DOUBLE : value->xDouble.value = self->xDouble.value; break; case DAO_COMPLEX : value->xComplex.value = self->xComplex.value; break; #ifdef DAO_WITH_LONGINT case DAO_LONG : DLong_Move( value->xLong.value, self->xLong.value ); break; #endif case DAO_STRING : DString_Assign( value->xString.data, self->xString.data ); break; } return value; }else{ switch( self->type ){ case DAO_NONE : return self; case DAO_INTEGER : return (DaoValue*) DaoInteger_New( self->xInteger.value ); case DAO_FLOAT : return (DaoValue*) DaoFloat_New( self->xFloat.value ); case DAO_DOUBLE : return (DaoValue*) DaoDouble_New( self->xDouble.value ); case DAO_COMPLEX : return (DaoValue*) DaoComplex_New( self->xComplex.value ); case DAO_LONG : return (DaoValue*) DaoLong_Copy( & self->xLong ); case DAO_STRING : return (DaoValue*) DaoString_Copy( & self->xString ); } } return self; /* unreachable; */ }else if( self->type == DAO_ENUM ){ return (DaoValue*) DaoEnum_Copy( & self->xEnum, tp ); }else if( tp && tp->tid >= DAO_INTEGER && tp->tid <= DAO_DOUBLE ){ DaoValue *value = cache ? DaoDataCache_MakeValue( cache, tp->tid ) : NULL; switch( value == NULL ? tp->tid : 0 ){ case DAO_INTEGER : value = (DaoValue*) DaoInteger_New(0); break; case DAO_FLOAT : value = (DaoValue*) DaoFloat_New(0); break; case DAO_DOUBLE : value = (DaoValue*) DaoDouble_New(0); break; } switch( tp->tid ){ case DAO_INTEGER : value->xInteger.value = DaoValue_GetInteger( self ); break; case DAO_FLOAT : value->xFloat.value = DaoValue_GetFloat( self ); break; case DAO_DOUBLE : value->xDouble.value = DaoValue_GetDouble( self ); break; } return value; } #ifdef DAO_WITH_NUMARRAY if( self->type == DAO_ARRAY && self->xArray.original ){ DaoArray_Sliced( (DaoArray*)self ); return self; }else #endif if( self->type == DAO_CSTRUCT || self->type == DAO_CDATA ){ FuncPtrSliced sliced = self->xCstruct.ctype->kernel->Sliced; if( sliced ) (*sliced)( self ); return self; } if( self->xBase.trait & DAO_VALUE_NOCOPY ) return self; if( (self->xBase.trait & DAO_VALUE_CONST) == 0 ) return self; switch( self->type ){ case DAO_LIST : return (DaoValue*) DaoList_Copy( (DaoList*) self, tp ); case DAO_MAP : return (DaoValue*) DaoMap_Copy( (DaoMap*) self, tp ); case DAO_TUPLE : return (DaoValue*) DaoTuple_Copy( (DaoTuple*) self, tp ); #ifdef DAO_WITH_NUMARRAY case DAO_ARRAY : return (DaoValue*) DaoArray_CopyX( (DaoArray*) self, tp ); #endif default : break; } return self; }