本文整理汇总了C++中UProperty::Identical方法的典型用法代码示例。如果您正苦于以下问题:C++ UProperty::Identical方法的具体用法?C++ UProperty::Identical怎么用?C++ UProperty::Identical使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类UProperty
的用法示例。
在下文中一共展示了UProperty::Identical方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ScanForChanges
/**
* Scans for changes to the value
*
* @param bRecacheNewValues If true, recaches new values found
* @return true if any changes were found
*/
bool ScanForChanges( bool bRecacheNewValues )
{
FPropertyNode& PropertyNodeRef = *PropertyNode.Pin();
UProperty* Property = PropertyNodeRef.GetProperty();
bool bPropertyValid = true;
bool bChanged = false;
UArrayProperty* OuterArrayProperty = Cast<UArrayProperty>( Property->GetOuter() );
if ( OuterArrayProperty != NULL )
{
// make sure we're not trying to compare against an element that doesn't exist
if ( PropertyNodeRef.GetArrayIndex() >= FScriptArrayHelper::Num( PropertyValueBaseAddress ) )
{
bPropertyValid = false;
}
}
if( bPropertyValid )
{
bChanged = !Property->Identical( PropertyValueAddress, Data.GetData() );
if( bRecacheNewValues )
{
CacheValue();
}
}
return bChanged;
}
示例2: DetermineUCSModifiedProperties
void UActorComponent::DetermineUCSModifiedProperties()
{
UCSModifiedProperties.Empty();
if (CreationMethod == EComponentCreationMethod::SimpleConstructionScript)
{
class FComponentPropertySkipper : public FArchive
{
public:
FComponentPropertySkipper()
: FArchive()
{
ArIsSaving = true;
}
virtual bool ShouldSkipProperty(const UProperty* InProperty) const override
{
return ( InProperty->HasAnyPropertyFlags(CPF_Transient | CPF_ContainsInstancedReference | CPF_InstancedReference)
|| !InProperty->HasAnyPropertyFlags(CPF_Edit | CPF_Interp));
}
} PropertySkipper;
UClass* ComponentClass = GetClass();
UObject* ComponentArchetype = GetArchetype();
for (TFieldIterator<UProperty> It(ComponentClass); It; ++It)
{
UProperty* Property = *It;
if( Property->ShouldSerializeValue(PropertySkipper) )
{
for( int32 Idx=0; Idx<Property->ArrayDim; Idx++ )
{
uint8* DataPtr = Property->ContainerPtrToValuePtr <uint8>((uint8*)this, Idx);
uint8* DefaultValue = Property->ContainerPtrToValuePtrForDefaults<uint8>(ComponentClass, (uint8*)ComponentArchetype, Idx);
if (!Property->Identical( DataPtr, DefaultValue))
{
UCSModifiedProperties.Add(FSimpleMemberReference());
FMemberReference::FillSimpleMemberReference<UProperty>(Property, UCSModifiedProperties.Last());
break;
}
}
}
}
}
}
示例3: GenericArray_Find
int32 UKismetArrayLibrary::GenericArray_Find(const void* TargetArray, const UArrayProperty* ArrayProperty, const void* ItemToFind)
{
int32 ResultIndex = INDEX_NONE;
if( TargetArray )
{
FScriptArrayHelper ArrayHelper(ArrayProperty, TargetArray);
UProperty* InnerProp = ArrayProperty->Inner;
// compare against each element in the array
for (int32 Idx = 0; Idx < ArrayHelper.Num() && ResultIndex == INDEX_NONE; Idx++)
{
if (InnerProp->Identical(ItemToFind,ArrayHelper.GetRawPtr(Idx)))
{
ResultIndex = Idx;
}
}
}
// assign the resulting index
return ResultIndex;
}
示例4: ArrayHelper
/**
* Exports the property values for the specified object as text to the output device.
*
* @param Context Context from which the set of 'inner' objects is extracted. If NULL, an object iterator will be used.
* @param Out the output device to send the exported text to
* @param ObjectClass the class of the object to dump properties for
* @param Object the address of the object to dump properties for
* @param Indent number of spaces to prepend to each line of output
* @param DiffClass the class to use for comparing property values when delta export is desired.
* @param Diff the address of the object to use for determining whether a property value should be exported. If the value in Object matches the corresponding
* value in Diff, it is not exported. Specify NULL to export all properties.
* @param Parent the UObject corresponding to Object
* @param PortFlags flags used for modifying the output and/or behavior of the export
*/
void ExportProperties
(
const FExportObjectInnerContext* Context,
FOutputDevice& Out,
UClass* ObjectClass,
uint8* Object,
int32 Indent,
UClass* DiffClass,
uint8* Diff,
UObject* Parent,
uint32 PortFlags,
UObject* ExportRootScope
)
{
FString ThisName = TEXT("(none)");
check(ObjectClass != NULL);
for( UProperty* Property = ObjectClass->PropertyLink; Property; Property = Property->PropertyLinkNext )
{
if (!Property->ShouldPort(PortFlags))
continue;
ThisName = Property->GetName();
UArrayProperty* ArrayProperty = Cast<UArrayProperty>(Property);
UObjectPropertyBase* ExportObjectProp = (Property->PropertyFlags & CPF_ExportObject) != 0 ? Cast<UObjectPropertyBase>(Property) : NULL;
const uint32 ExportFlags = PortFlags | PPF_Delimited;
if ( ArrayProperty != NULL )
{
// Export dynamic array.
UProperty* InnerProp = ArrayProperty->Inner;
ExportObjectProp = (Property->PropertyFlags & CPF_ExportObject) != 0 ? Cast<UObjectPropertyBase>(InnerProp) : NULL;
// This is used as the default value in the case of an array property that has
// fewer elements than the exported object.
uint8* StructDefaults = NULL;
UStructProperty* StructProperty = Cast<UStructProperty>(InnerProp);
if ( StructProperty != NULL )
{
checkSlow(StructProperty->Struct);
StructDefaults = (uint8*)FMemory::Malloc(StructProperty->Struct->GetStructureSize());
StructProperty->InitializeValue(StructDefaults);
}
for( int32 PropertyArrayIndex=0; PropertyArrayIndex<Property->ArrayDim; PropertyArrayIndex++ )
{
void* Arr = Property->ContainerPtrToValuePtr<void>(Object, PropertyArrayIndex);
FScriptArrayHelper ArrayHelper(ArrayProperty, Arr);
void* DiffArr = NULL;
if( DiffClass )
{
DiffArr = Property->ContainerPtrToValuePtrForDefaults<void>(DiffClass, Diff, PropertyArrayIndex);
}
// we won't use this if DiffArr is NULL, but we have to set it up to something
FScriptArrayHelper DiffArrayHelper(ArrayProperty, DiffArr);
bool bAnyElementDiffered = false;
for( int32 DynamicArrayIndex=0; DynamicArrayIndex<ArrayHelper.Num(); DynamicArrayIndex++ )
{
FString Value;
// compare each element's value manually so that elements which match the NULL value for the array's inner property type
// but aren't in the diff array are still exported
uint8* SourceData = ArrayHelper.GetRawPtr(DynamicArrayIndex);
uint8* DiffData = DiffArr && DynamicArrayIndex < DiffArrayHelper.Num()
? DiffArrayHelper.GetRawPtr(DynamicArrayIndex)
: StructDefaults;
bool bExportItem = DiffData == NULL || (DiffData != SourceData && !InnerProp->Identical(SourceData, DiffData, ExportFlags));
if ( bExportItem )
{
bAnyElementDiffered = true;
InnerProp->ExportTextItem(Value, SourceData, DiffData, Parent, ExportFlags, ExportRootScope);
if(ExportObjectProp)
{
UObject* Obj = ExportObjectProp->GetObjectPropertyValue(ArrayHelper.GetRawPtr(DynamicArrayIndex));
check(!Obj || Obj->IsValidLowLevel());
if( Obj && !Obj->HasAnyMarks(OBJECTMARK_TagImp) )
{
// only export the BEGIN OBJECT block for a component if Parent is the component's Outer....when importing subobject definitions,
// (i.e. BEGIN OBJECT), whichever BEGIN OBJECT block a component's BEGIN OBJECT block is located within is the object that will be
// used as the Outer to create the component
// Is this an array of components?
if ( InnerProp->HasAnyPropertyFlags(CPF_InstancedReference) )
{
//.........这里部分代码省略.........
示例5: ReceivedBunch
//.........这里部分代码省略.........
return false;
}
UScriptStruct::ICppStructOps * CppStructOps = InnerStruct->GetCppStructOps();
check( CppStructOps );
check( !InnerStruct->InheritedCppStructOps() );
FNetDeltaSerializeInfo Parms;
FNetSerializeCB NetSerializeCB( OwningChannel->Connection->Driver );
Parms.DebugName = StructProperty->GetName();
Parms.Struct = InnerStruct;
Parms.Map = PackageMap;
Parms.InArchive = &Bunch;
Parms.NetSerializeCB = &NetSerializeCB;
// Call the custom delta serialize function to handle it
CppStructOps->NetDeltaSerialize( Parms, Data );
if ( Bunch.IsError() )
{
UE_LOG( LogNet, Error, TEXT( "ReceivedBunch: NetDeltaSerialize - Bunch.IsError() == true: %s" ), *Object->GetFullName() );
return false;
}
// See if it changed from our local value
bool PropertyChanged = true;
if ( DestRecent )
{
// POD types can do a memcmp with a call to Identical
if ( ReplicatedProp->Identical( DestRecent + Offset, Data ) )
{
PropertyChanged = false;
}
}
Mark.Pop();
// Successfully received it.
UE_LOG( LogNetTraffic, Log, TEXT( " %s - %s - Change: %d" ), *Object->GetName(), *ReplicatedProp->GetName(), PropertyChanged );
// Notify the Object if this var is RepNotify
if ( PropertyChanged )
{
QueuePropertyRepNotify( Object, ReplicatedProp, Element, MetaData );
}
}
// Next.
RepIndex = Bunch.ReadInt( ClassCache->GetMaxIndex() + 1 );
if ( Bunch.IsError() )
{
UE_LOG( LogNet, Error, TEXT( "ReceivedBunch: Error reading bunch 2: %s" ), *Object->GetFullName() );
return false;
}
if ( RepIndex > ClassCache->GetMaxIndex() )
{
UE_LOG( LogNet, Error, TEXT( "ReceivedBunch: RepIndex too large: %s" ), *Object->GetFullName() );
return false;
}
示例6: GetReadAddressUncached
bool FObjectPropertyNode::GetReadAddressUncached(FPropertyNode& InNode,
bool InRequiresSingleSelection,
FReadAddressListData& OutAddresses,
bool bComparePropertyContents,
bool bObjectForceCompare,
bool bArrayPropertiesCanDifferInSize) const
{
// Are any objects selected for property editing?
if( !GetNumObjects())
{
return false;
}
UProperty* InItemProperty = InNode.GetProperty();
// Is there a InItemProperty bound to the InItemProperty window?
if( !InItemProperty )
{
return false;
}
// Requesting a single selection?
if( InRequiresSingleSelection && GetNumObjects() > 1)
{
// Fail: we're editing properties for multiple objects.
return false;
}
//assume all properties are the same unless proven otherwise
bool bAllTheSame = true;
//////////////////////////////////////////
// If this item is the child of an array, return NULL if there is a different number
// of items in the array in different objects, when multi-selecting.
if( Cast<UArrayProperty>(InItemProperty->GetOuter()) )
{
FPropertyNode* ParentNode = InNode.GetParentNode();
check(ParentNode);
const UObject* TempObject = GetUObject(0);
if( TempObject )
{
uint8* BaseAddr = ParentNode->GetValueBaseAddress( (uint8*)TempObject );
if( BaseAddr )
{
const int32 Num = FScriptArrayHelper::Num(BaseAddr);
for( int32 ObjIndex = 1 ; ObjIndex < GetNumObjects(); ObjIndex++ )
{
TempObject = GetUObject(ObjIndex);
BaseAddr = ParentNode->GetValueBaseAddress( (uint8*)TempObject );
if( BaseAddr && Num != FScriptArrayHelper::Num( BaseAddr ) )
{
bAllTheSame = false;
}
}
}
}
}
uint8* Base = GetUObject(0) ? InNode.GetValueBaseAddress( (uint8*)(GetUObject(0)) ) : NULL;
if (Base)
{
// If the item is an array itself, return NULL if there are a different number of
// items in the array in different objects, when multi-selecting.
if( Cast<UArrayProperty>(InItemProperty) )
{
// This flag is an override for array properties which want to display e.g. the "Clear" and "Empty"
// buttons, even though the array properties may differ in the number of elements.
if ( !bArrayPropertiesCanDifferInSize )
{
const UObject* TempObject = GetUObject(0);
int32 const Num = FScriptArrayHelper::Num(InNode.GetValueBaseAddress( (uint8*)TempObject));
for( int32 ObjIndex = 1 ; ObjIndex < GetNumObjects() ; ObjIndex++ )
{
TempObject = GetUObject(ObjIndex);
if( TempObject && Num != FScriptArrayHelper::Num(InNode.GetValueBaseAddress((uint8*)TempObject)) )
{
bAllTheSame = false;
}
}
}
}
else
{
if ( bComparePropertyContents || !Cast<UObjectPropertyBase>(InItemProperty) || bObjectForceCompare )
{
// Make sure the value of this InItemProperty is the same in all selected objects.
for( int32 ObjIndex = 1 ; ObjIndex < GetNumObjects() ; ObjIndex++ )
{
const UObject* TempObject = GetUObject(ObjIndex);
if( !InItemProperty->Identical( Base, InNode.GetValueBaseAddress( (uint8*)TempObject ) ) )
{
bAllTheSame = false;
}
}
}
else
{
//.........这里部分代码省略.........