void DaoValue_CopyX( DaoValue *src, DaoValue **dest, DaoDataCache *cache ) { DaoValue *dest2 = *dest; if( src == dest2 ) return; if( dest2 && dest2->xBase.refCount >1 ){ GC_DecRC( dest2 ); *dest = dest2 = NULL; } if( dest2 == NULL ){ src = DaoValue_SimpleCopyWithTypeX( src, NULL, cache ); GC_IncRC( src ); *dest = src; return; } if( src->type != dest2->type || src->type > DAO_ENUM ){ src = DaoValue_SimpleCopyWithTypeX( src, NULL, cache ); GC_ShiftRC( src, dest2 ); *dest = src; return; } switch( src->type ){ case DAO_ENUM : DaoEnum_SetType( & dest2->xEnum, src->xEnum.etype ); DaoEnum_SetValue( & dest2->xEnum, & src->xEnum, NULL ); break; case DAO_INTEGER : dest2->xInteger.value = src->xInteger.value; break; case DAO_FLOAT : dest2->xFloat.value = src->xFloat.value; break; case DAO_DOUBLE : dest2->xDouble.value = src->xDouble.value; break; case DAO_COMPLEX : dest2->xComplex.value = src->xComplex.value; break; #ifdef DAO_WITH_LONGINT case DAO_LONG : DLong_Move( dest2->xLong.value, src->xLong.value ); break; #endif case DAO_STRING : DString_Assign( dest2->xString.data, src->xString.data ); break; } }
int DaoEnum_Compare( DaoEnum *L, DaoEnum *R ) { DaoEnum E; DNode *N = NULL; DMap *ML = L->etype->mapNames; DMap *MR = R->etype->mapNames; uchar_t FL = L->etype->flagtype; uchar_t FR = R->etype->flagtype; char SL = L->etype->name->mbs[0]; char SR = R->etype->name->mbs[0]; if( L->etype == R->etype ){ return L->value == R->value ? 0 : ( L->value < R->value ? -1 : 1 ); }else if( SL == '$' && SR == '$' && FL == 0 && FR == 0 ){ return DString_Compare( L->etype->name, R->etype->name ); }else if( SL == '$' && SR == '$' ){ if( L->etype->mapNames->size != R->etype->mapNames->size ){ return number_compare( L->etype->mapNames->size, R->etype->mapNames->size ); }else{ for(N=DMap_First(ML);N;N=DMap_Next(ML,N)){ if( DMap_Find( MR, N->key.pVoid ) ==0 ) return -1; } return 0; } }else if( SL == '$' ){ E.etype = R->etype; E.value = R->value; DaoEnum_SetValue( & E, L, NULL ); return E.value == R->value ? 0 : ( E.value < R->value ? -1 : 1 ); }else if( SR == '$' ){ E.etype = L->etype; E.value = L->value; DaoEnum_SetValue( & E, R, NULL ); return L->value == E.value ? 0 : ( L->value < E.value ? -1 : 1 ); }else{ return L->value == R->value ? 0 : ( L->value < R->value ? -1 : 1 ); } }
void DaoValue_CopyX( DaoValue *src, DaoValue **dest, DaoType *cst ) { DaoValue *dest2 = *dest; if( src == dest2 ) return; if( dest2 && dest2->xBase.refCount >1 ){ GC_DecRC( dest2 ); *dest = dest2 = NULL; } if( src->type == DAO_CSTRUCT || src->type == DAO_CDATA ){ DaoValue_MoveCstruct( src, dest, cst != NULL && cst->invar != 0 ); return; }else if( src->type == DAO_CINVALUE ){ DaoValue_MoveCinValue( (DaoCinValue*) src, dest ); return; } if( dest2 == NULL ){ src = DaoValue_SimpleCopyWithTypeX( src, NULL, cst ); GC_IncRC( src ); *dest = src; return; } if( src->type != dest2->type || src->type > DAO_ENUM ){ src = DaoValue_SimpleCopyWithTypeX( src, NULL, cst ); GC_Assign( dest, src ); return; } switch( src->type ){ case DAO_ENUM : DaoEnum_SetType( & dest2->xEnum, src->xEnum.etype ); DaoEnum_SetValue( & dest2->xEnum, & src->xEnum ); break; case DAO_BOOLEAN : dest2->xBoolean.value = src->xBoolean.value; break; case DAO_INTEGER : dest2->xInteger.value = src->xInteger.value; break; case DAO_FLOAT : dest2->xFloat.value = src->xFloat.value; break; case DAO_COMPLEX : dest2->xComplex.value = src->xComplex.value; break; case DAO_STRING : DString_Assign( dest2->xString.value, src->xString.value ); break; } }
int DaoValue_Move5( DaoValue *S, DaoValue **D, DaoType *T, DMap *defs, DaoDataCache *cache ) { DaoValue *D2 = *D; if( S == D2 ) return 1; if( S == NULL ){ GC_DecRC( *D ); *D = NULL; return 0; } if( T == NULL ){ DaoValue_CopyX( S, D, cache ); return 1; } switch( T->tid ){ case DAO_UDT : DaoValue_CopyX( S, D, cache ); return 1; case DAO_THT : if( T->aux ) return DaoValue_Move4( S, D, (DaoType*) T->aux, defs, cache ); DaoValue_CopyX( S, D, cache ); return 1; case DAO_ANY : DaoValue_CopyX( S, D, cache ); DaoValue_SetType( *D, T ); return 1; case DAO_VALTYPE : if( DaoValue_Compare( S, T->aux ) !=0 ) return 0; DaoValue_CopyX( S, D, cache ); return 1; case DAO_VARIANT : return DaoValue_MoveVariant( S, D, T ); default : break; } if( D2 && D2->xBase.refCount >1 ){ GC_DecRC( D2 ); *D = D2 = NULL; } if( D2 == NULL || D2->type != T->tid ) return DaoValue_Move4( S, D, T, defs, cache ); switch( (S->type << 8) | T->tid ){ case (DAO_STRING<<8)|DAO_STRING : DString_Assign( D2->xString.data, S->xString.data ); break; case (DAO_ENUM<<8)|DAO_ENUM : DaoEnum_SetType( & D2->xEnum, T ); DaoEnum_SetValue( & D2->xEnum, & S->xEnum, NULL ); break; case (DAO_INTEGER<<8)|DAO_INTEGER : D2->xInteger.value = S->xInteger.value; break; case (DAO_INTEGER<<8)|DAO_FLOAT : D2->xFloat.value = S->xInteger.value; break; case (DAO_INTEGER<<8)|DAO_DOUBLE : D2->xDouble.value = S->xInteger.value; break; case (DAO_FLOAT <<8)|DAO_INTEGER : D2->xInteger.value = S->xFloat.value; break; case (DAO_FLOAT <<8)|DAO_FLOAT : D2->xFloat.value = S->xFloat.value; break; case (DAO_FLOAT <<8)|DAO_DOUBLE : D2->xDouble.value = S->xFloat.value; break; case (DAO_DOUBLE <<8)|DAO_INTEGER : D2->xInteger.value = S->xDouble.value; break; case (DAO_DOUBLE <<8)|DAO_FLOAT : D2->xFloat.value = S->xDouble.value; break; case (DAO_DOUBLE <<8)|DAO_DOUBLE : D2->xDouble.value = S->xDouble.value; break; case (DAO_COMPLEX<<8)|DAO_COMPLEX : D2->xComplex.value = S->xComplex.value; break; #ifdef DAO_WITH_LONGINT case (DAO_LONG <<8)|DAO_LONG : DLong_Move( D2->xLong.value, S->xLong.value ); break; #endif default : return DaoValue_Move4( S, D, T, defs, cache ); } return 1; }
int DaoValue_Move5( DaoValue *S, DaoValue **D, DaoType *T, DaoType *C, DMap *defs ) { DaoValue *D2 = *D; if( S == D2 && (S == NULL || DaoValue_FastMatchTo( S, T )) ) return 1; if( S == NULL ){ GC_DecRC( *D ); *D = NULL; return 0; } if( T == NULL ){ DaoValue_CopyX( S, D, C ); return 1; } if( T->valtype ){ if( DaoValue_Compare( S, T->value ) !=0 ) return 0; DaoValue_CopyX( S, D, C ); return 1; } switch( T->tid ){ case DAO_UDT : DaoValue_CopyX( S, D, C ); return 1; case DAO_THT : if( T->aux ) return DaoValue_Move5( S, D, (DaoType*) T->aux, C, defs ); DaoValue_CopyX( S, D, C ); return 1; case DAO_ANY : DaoValue_CopyX( S, D, C ); DaoValue_SetType( *D, T ); return 1; case DAO_VARIANT : return DaoValue_MoveVariant( S, D, T, C ); default : break; } if( S->type >= DAO_OBJECT || !(S->xBase.trait & DAO_VALUE_CONST) || T->invar ){ if( DaoValue_FastMatchTo( S, T ) ){ if( S->type == DAO_CDATA && S->xCdata.data == NULL ){ if( ! DaoType_IsNullable( T ) ) return 0; } if( S->type == DAO_CSTRUCT || S->type == DAO_CDATA ){ DaoValue_MoveCstruct( S, D, C != NULL && C->invar != 0 ); }else if( S->type == DAO_CINVALUE ){ DaoValue_MoveCinValue( (DaoCinValue*) S, D ); }else{ GC_Assign( D, S ); } return 1; } } if( S->type == DAO_CINVALUE ){ if( S->xCinValue.cintype->target == T ){ S = S->xCinValue.value; }else if( DaoType_MatchTo( S->xCinValue.cintype->target, T, NULL ) >= DAO_MT_EQ ){ S = S->xCinValue.value; } } if( D2 && D2->xBase.refCount > 1 ){ GC_DecRC( D2 ); *D = D2 = NULL; } #if 0 if( D2 && S->type == D2->type && S->type == T->tid && S->type <= DAO_ENUM ){ switch( S->type ){ case DAO_ENUM : DaoEnum_SetType( & D2->xEnum, T->subtid == DAO_ENUM_ANY ? S->xEnum.etype : T ); return DaoEnum_SetValue( & D2->xEnum, & S->xEnum ); case DAO_BOOLEAN : case DAO_INTEGER : D2->xInteger.value = S->xInteger.value; break; case DAO_FLOAT : D2->xFloat.value = S->xFloat.value; break; case DAO_COMPLEX : D2->xComplex.value = S->xComplex.value; break; case DAO_STRING : DString_Assign( D2->xString.value, S->xString.value ); break; } return 1; } #endif if( D2 == NULL || D2->type != T->tid ) return DaoValue_Move4( S, D, T, C, defs ); switch( (S->type << 8) | T->tid ){ case (DAO_STRING<<8)|DAO_STRING : DString_Assign( D2->xString.value, S->xString.value ); break; case (DAO_ENUM<<8)|DAO_ENUM : DaoEnum_SetType( & D2->xEnum, T->subtid == DAO_ENUM_ANY ? S->xEnum.etype : T ); DaoEnum_SetValue( & D2->xEnum, & S->xEnum ); break; case (DAO_CINVALUE<<8)|DAO_CINVALUE : if( S->xCinValue.cintype->vatype != T ) return DaoValue_Move4( S, D, T, C, defs ); DaoValue_MoveCinValue( (DaoCinValue*) S, D ); break; case (DAO_BOOLEAN<<8)|DAO_BOOLEAN : D2->xBoolean.value = S->xBoolean.value; break; case (DAO_BOOLEAN<<8)|DAO_INTEGER : D2->xInteger.value = S->xBoolean.value; break; case (DAO_BOOLEAN<<8)|DAO_FLOAT : D2->xFloat.value = S->xBoolean.value; break; case (DAO_INTEGER<<8)|DAO_BOOLEAN : D2->xBoolean.value = S->xInteger.value; break; case (DAO_INTEGER<<8)|DAO_INTEGER : D2->xInteger.value = S->xInteger.value; break; case (DAO_INTEGER<<8)|DAO_FLOAT : D2->xFloat.value = S->xInteger.value; break; case (DAO_FLOAT <<8)|DAO_BOOLEAN : D2->xBoolean.value = S->xFloat.value; break; case (DAO_FLOAT <<8)|DAO_INTEGER : D2->xInteger.value = S->xFloat.value; break; case (DAO_FLOAT <<8)|DAO_FLOAT : D2->xFloat.value = S->xFloat.value; break; case (DAO_COMPLEX<<8)|DAO_COMPLEX : D2->xComplex.value = S->xComplex.value; break; default : return DaoValue_Move4( S, D, T, C, defs ); } return 1; }