OpenClonk
C4SortObjectMultiple Class Reference

#include <C4FindObject.h>

Inheritance diagram for C4SortObjectMultiple:
[legend]
Collaboration diagram for C4SortObjectMultiple:
[legend]

Public Member Functions

 C4SortObjectMultiple (int32_t iCnt, C4SortObject **ppSorts, bool fFreeArray=true)
 
 ~C4SortObjectMultiple () override
 
void SortObjects (C4ValueArray *pArray)
 

Static Public Member Functions

static C4SortObjectCreateByValue (const C4Value &Data, const C4Object *context=nullptr)
 
static C4SortObjectCreateByValue (int32_t iType, const C4ValueArray &Data, const C4Object *context=nullptr)
 

Protected Member Functions

int32_t Compare (C4Object *pObj1, C4Object *pObj2) override
 
bool PrepareCache (const C4ValueArray *pObjs) override
 
int32_t CompareCache (int32_t iObj1, int32_t iObj2, C4Object *pObj1, C4Object *pObj2) override
 

Detailed Description

Definition at line 475 of file C4FindObject.h.

Constructor & Destructor Documentation

◆ C4SortObjectMultiple()

C4SortObjectMultiple::C4SortObjectMultiple ( int32_t  iCnt,
C4SortObject **  ppSorts,
bool  fFreeArray = true 
)
inline

Definition at line 478 of file C4FindObject.h.

479  : C4SortObject(), fFreeArray(fFreeArray), iCnt(iCnt), ppSorts(ppSorts) {}
C4SortObject()=default

References iCnt.

◆ ~C4SortObjectMultiple()

C4SortObjectMultiple::~C4SortObjectMultiple ( )
override

Definition at line 1008 of file C4FindObject.cpp.

1009 {
1010  for (int32_t i=0; i<iCnt; ++i) delete ppSorts[i];
1011  if (fFreeArray) delete [] ppSorts;
1012 }

Member Function Documentation

◆ Compare()

int32_t C4SortObjectMultiple::Compare ( C4Object pObj1,
C4Object pObj2 
)
overrideprotectedvirtual

Implements C4SortObject.

Definition at line 1014 of file C4FindObject.cpp.

1015 {
1016  // return first comparison that's nonzero
1017  int32_t iCmp;
1018  for (int32_t i=0; i<iCnt; ++i)
1019  if ((iCmp = ppSorts[i]->Compare(pObj1, pObj2)))
1020  return iCmp;
1021  // all comparisons equal
1022  return 0;
1023 }
int32_t Compare(C4Object *pObj1, C4Object *pObj2) override

◆ CompareCache()

int32_t C4SortObjectMultiple::CompareCache ( int32_t  iObj1,
int32_t  iObj2,
C4Object pObj1,
C4Object pObj2 
)
overrideprotectedvirtual

Reimplemented from C4SortObject.

Definition at line 1034 of file C4FindObject.cpp.

1035 {
1036  // return first comparison that's nonzero
1037  int32_t iCmp;
1038  for (int32_t i=0; i<iCnt; ++i)
1039  if ((iCmp = ppSorts[i]->CompareCache(iObj1, iObj2, pObj1, pObj2)))
1040  return iCmp;
1041  // all comparisons equal
1042  return 0;
1043 }
int32_t CompareCache(int32_t iObj1, int32_t iObj2, C4Object *pObj1, C4Object *pObj2) override

◆ CreateByValue() [1/2]

C4SortObject * C4SortObject::CreateByValue ( const C4Value Data,
const C4Object context = nullptr 
)
staticinherited

Definition at line 853 of file C4FindObject.cpp.

854 {
855  // Must be an array
856  const C4ValueArray *pArray = C4Value(DataVal).getArray();
857  if (!pArray) return nullptr;
858  const C4ValueArray &Data = *pArray;
859  int32_t iType = Data[0].getInt();
860  return CreateByValue(iType, Data, context);
861 }
static C4SortObject * CreateByValue(const C4Value &Data, const C4Object *context=nullptr)
C4ValueArray * getArray() const
Definition: C4Value.h:118

References C4Value::getArray().

Referenced by C4FindObject::CreateByValue(), and C4SortObject::CreateByValue().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ CreateByValue() [2/2]

C4SortObject * C4SortObject::CreateByValue ( int32_t  iType,
const C4ValueArray Data,
const C4Object context = nullptr 
)
staticinherited

Definition at line 863 of file C4FindObject.cpp.

864 {
865  switch (iType)
866  {
867  case C4SO_Reverse:
868  {
869  // create child sort
870  C4SortObject *pChildSort = C4SortObject::CreateByValue(Data[1], context);
871  if (!pChildSort) return nullptr;
872  // wrap
873  return new C4SortObjectReverse(pChildSort);
874  }
875 
876  case C4SO_Multiple:
877  {
878  // Trivial case (one sort)
879  if (Data.GetSize() == 2)
880  {
881  return C4SortObject::CreateByValue(Data[1], context);
882  }
883  // Create all children
884  int32_t i;
885  C4SortObject **ppSorts = new C4SortObject *[Data.GetSize() - 1];
886  for (i = 0; i < Data.GetSize() - 1; i++)
887  {
888  ppSorts[i] = C4SortObject::CreateByValue(Data[i+1], context);
889  }
890  // Count real entries, move them to start of list
891  int32_t iSize = 0;
892  for (i = 0; i < Data.GetSize() - 1; i++)
893  if (ppSorts[i])
894  if (iSize++ != i)
895  ppSorts[iSize-1] = ppSorts[i];
896  // Create
897  return new C4SortObjectMultiple(iSize, ppSorts);
898  }
899 
900  case C4SO_Distance:
901  {
902  int32_t x = Data[1].getInt();
903  int32_t y = Data[2].getInt();
904  if (context)
905  {
906  x += context->GetX();
907  y += context->GetY();
908  }
909  return new C4SortObjectDistance(x, y);
910  }
911 
912  case C4SO_Random:
913  return new C4SortObjectRandom();
914 
915  case C4SO_Speed:
916  return new C4SortObjectSpeed();
917 
918  case C4SO_Mass:
919  return new C4SortObjectMass();
920 
921  case C4SO_Value:
922  return new C4SortObjectValue();
923 
924  case C4SO_Func:
925  {
926  // Get function name
927  C4String *pStr = Data[1].getStr();
928  if (!pStr) return nullptr;
929  // Construct
930  C4SortObjectFunc *pSO = new C4SortObjectFunc(pStr);
931  // Add parameters
932  for (int i = 2; i < Data.GetSize(); i++)
933  pSO->SetPar(i - 2, Data[i]);
934  // Done
935  return pSO;
936  }
937 
938  }
939  return nullptr;
940 }
@ C4SO_Mass
Definition: C4FindObject.h:62
@ C4SO_Reverse
Definition: C4FindObject.h:57
@ C4SO_Distance
Definition: C4FindObject.h:59
@ C4SO_Random
Definition: C4FindObject.h:60
@ C4SO_Speed
Definition: C4FindObject.h:61
@ C4SO_Value
Definition: C4FindObject.h:63
@ C4SO_Multiple
Definition: C4FindObject.h:58
@ C4SO_Func
Definition: C4FindObject.h:64
int iSize
Definition: TstC4NetIO.cpp:32
int32_t GetX() const
Definition: C4Object.h:285
int32_t GetY() const
Definition: C4Object.h:286
void SetPar(int i, const C4Value &val)
int32_t GetSize() const
Definition: C4ValueArray.h:36

References C4SO_Distance, C4SO_Func, C4SO_Mass, C4SO_Multiple, C4SO_Random, C4SO_Reverse, C4SO_Speed, C4SO_Value, C4SortObject::CreateByValue(), C4ValueArray::GetSize(), C4Object::GetX(), C4Object::GetY(), iSize, and C4SortObjectFunc::SetPar().

Here is the call graph for this function:

◆ PrepareCache()

bool C4SortObjectMultiple::PrepareCache ( const C4ValueArray pObjs)
overrideprotectedvirtual

Reimplemented from C4SortObject.

Definition at line 1025 of file C4FindObject.cpp.

1026 {
1027  bool fCaches = false;
1028  for (int32_t i=0; i<iCnt; ++i)
1029  fCaches |= ppSorts[i]->PrepareCache(pObjs);
1030  // return wether a sort citerion uses a cache
1031  return fCaches;
1032 }
bool PrepareCache(const C4ValueArray *pObjs) override

◆ SortObjects()

void C4SortObject::SortObjects ( C4ValueArray pArray)
inherited

Definition at line 942 of file C4FindObject.cpp.

943 {
944  pArray->Sort(*this);
945 }
void Sort(class C4SortObject &rSort)

References C4ValueArray::Sort().

Referenced by C4FindObject::FindMany().

Here is the call graph for this function:
Here is the caller graph for this function:

The documentation for this class was generated from the following files: