// Copyright Epic Games, Inc. All Rights Reserved. #include "TimerGroupingAndSorting.h" #include "Insights/Table/ViewModels/TableColumn.h" #include "Insights/ViewModels/TimerNodeHelper.h" #define LOCTEXT_NAMESPACE "TimerNode" // Sort by name (ascending). #define INSIGHTS_DEFAULT_SORTING_NODES(A, B) return A->GetName().LexicalLess(B->GetName()); // #define INSIGHTS_DEFAULT_SORTING_NODES(A, B) return A->GetDefaultSortOrder() < B->GetDefaultSortOrder(); //////////////////////////////////////////////////////////////////////////////////////////////////// // Sorting by Timer Type //////////////////////////////////////////////////////////////////////////////////////////////////// FTimerNodeSortingByTimerType::FTimerNodeSortingByTimerType(TSharedRef InColumnRef) : Insights::FTableCellValueSorter( FName(TEXT("ByTimerType")), LOCTEXT("Sorting_ByTimerType_Name", "By Type"), LOCTEXT("Sorting_ByTimerType_Title", "Sort By Type"), LOCTEXT("Sorting_ByTimerType_Desc", "Sort by timer type."), InColumnRef) { } //////////////////////////////////////////////////////////////////////////////////////////////////// void FTimerNodeSortingByTimerType::Sort(TArray& NodesToSort, Insights::ESortMode SortMode) const { if (SortMode == Insights::ESortMode::Ascending) { NodesToSort.Sort([](const Insights::FBaseTreeNodePtr& A, const Insights::FBaseTreeNodePtr& B) -> bool { ensure(A.IsValid() && A->GetTypeName() == FTimerNode::TypeName); const FTimerNodePtr TimerNodeA = StaticCastSharedPtr(A); ensure(B.IsValid() && B->GetTypeName() == FTimerNode::TypeName); const FTimerNodePtr TimerNodeB = StaticCastSharedPtr(B); if (TimerNodeA->GetType() == TimerNodeB->GetType()) { INSIGHTS_DEFAULT_SORTING_NODES(A, B) } else { // Sort by timer type (ascending). return TimerNodeA->GetType() < TimerNodeB->GetType(); } }); } else // if (SortMode == ESortMode::Descending) { NodesToSort.Sort([](const Insights::FBaseTreeNodePtr& A, const Insights::FBaseTreeNodePtr& B) -> bool { ensure(A.IsValid() && A->GetTypeName() == FTimerNode::TypeName); const FTimerNodePtr TimerNodeA = StaticCastSharedPtr(A); ensure(B.IsValid() && B->GetTypeName() == FTimerNode::TypeName); const FTimerNodePtr TimerNodeB = StaticCastSharedPtr(B); if (TimerNodeA->GetType() == TimerNodeB->GetType()) { INSIGHTS_DEFAULT_SORTING_NODES(A, B) } else { // Sort by timer type (descending). return TimerNodeB->GetType() < TimerNodeA->GetType(); } }); } } //////////////////////////////////////////////////////////////////////////////////////////////////// // Sort by Instance Count //////////////////////////////////////////////////////////////////////////////////////////////////// FTimerNodeSortingByInstanceCount::FTimerNodeSortingByInstanceCount(TSharedRef InColumnRef) : Insights::FTableCellValueSorter( FName(TEXT("ByInstanceCount")), LOCTEXT("Sorting_ByInstanceCount_Name", "By Instance Count"), LOCTEXT("Sorting_ByInstanceCount_Title", "Sort By Instance Count"), LOCTEXT("Sorting_ByInstanceCount_Desc", "Sort by aggregated instance count."), InColumnRef) { } //////////////////////////////////////////////////////////////////////////////////////////////////// void FTimerNodeSortingByInstanceCount::Sort(TArray& NodesToSort, Insights::ESortMode SortMode) const { if (SortMode == Insights::ESortMode::Ascending) { NodesToSort.Sort([](const Insights::FBaseTreeNodePtr& A, const Insights::FBaseTreeNodePtr& B) -> bool { ensure(A.IsValid() && A->GetTypeName() == FTimerNode::TypeName); const FTimerNodePtr TimerNodeA = StaticCastSharedPtr(A); const uint64 ValueA = TimerNodeA->GetAggregatedStats().InstanceCount; ensure(B.IsValid() && B->GetTypeName() == FTimerNode::TypeName); const FTimerNodePtr TimerNodeB = StaticCastSharedPtr(B); const uint64 ValueB = TimerNodeB->GetAggregatedStats().InstanceCount; if (ValueA == ValueB) { INSIGHTS_DEFAULT_SORTING_NODES(A, B) } else { // Sort by instance count (ascending). return ValueA < ValueB; } }); } else // if (SortMode == ESortMode::Descending) { NodesToSort.Sort([](const Insights::FBaseTreeNodePtr& A, const Insights::FBaseTreeNodePtr& B) -> bool { ensure(A.IsValid() && A->GetTypeName() == FTimerNode::TypeName); const FTimerNodePtr TimerNodeA = StaticCastSharedPtr(A); const uint64 ValueA = TimerNodeA->GetAggregatedStats().InstanceCount; ensure(B.IsValid() && B->GetTypeName() == FTimerNode::TypeName); const FTimerNodePtr TimerNodeB = StaticCastSharedPtr(B); const uint64 ValueB = TimerNodeB->GetAggregatedStats().InstanceCount; if (ValueA == ValueB) { INSIGHTS_DEFAULT_SORTING_NODES(A, B) } else { // Sort by instance count (descending). return ValueB < ValueA; } }); } } //////////////////////////////////////////////////////////////////////////////////////////////////// // Sort by Total Inclusive Time //////////////////////////////////////////////////////////////////////////////////////////////////// FTimerNodeSortingByTotalInclusiveTime::FTimerNodeSortingByTotalInclusiveTime(TSharedRef InColumnRef) : Insights::FTableCellValueSorter( FName(TEXT("ByTotalInclusiveTime")), LOCTEXT("Sorting_ByTotalInclusiveTime_Name", "By Total Inclusive Time"), LOCTEXT("Sorting_ByTotalInclusiveTime_Title", "Sort By Total Inclusive Time"), LOCTEXT("Sorting_ByTotalInclusiveTime_Desc", "Sort by aggregated total inclusive time."), InColumnRef) { } //////////////////////////////////////////////////////////////////////////////////////////////////// void FTimerNodeSortingByTotalInclusiveTime::Sort(TArray& NodesToSort, Insights::ESortMode SortMode) const { if (SortMode == Insights::ESortMode::Ascending) { NodesToSort.Sort([](const Insights::FBaseTreeNodePtr& A, const Insights::FBaseTreeNodePtr& B) -> bool { ensure(A.IsValid() && A->GetTypeName() == FTimerNode::TypeName); const FTimerNodePtr TimerNodeA = StaticCastSharedPtr(A); const double ValueA = TimerNodeA->GetAggregatedStats().TotalInclusiveTime; ensure(B.IsValid() && B->GetTypeName() == FTimerNode::TypeName); const FTimerNodePtr TimerNodeB = StaticCastSharedPtr(B); const double ValueB = TimerNodeB->GetAggregatedStats().TotalInclusiveTime; if (ValueA == ValueB) { INSIGHTS_DEFAULT_SORTING_NODES(A, B) } else { // Sort by total inclusive time (ascending). return ValueA < ValueB; } }); } else // if (SortMode == ESortMode::Descending) { NodesToSort.Sort([](const Insights::FBaseTreeNodePtr& A, const Insights::FBaseTreeNodePtr& B) -> bool { ensure(A.IsValid() && A->GetTypeName() == FTimerNode::TypeName); const FTimerNodePtr TimerNodeA = StaticCastSharedPtr(A); const double ValueA = TimerNodeA->GetAggregatedStats().TotalInclusiveTime; ensure(B.IsValid() && B->GetTypeName() == FTimerNode::TypeName); const FTimerNodePtr TimerNodeB = StaticCastSharedPtr(B); const double ValueB = TimerNodeB->GetAggregatedStats().TotalInclusiveTime; if (ValueA == ValueB) { INSIGHTS_DEFAULT_SORTING_NODES(A, B) } else { // Sort by total inclusive time (descending). return ValueB < ValueA; } }); } } //////////////////////////////////////////////////////////////////////////////////////////////////// // Sort by Total Exclusive Time //////////////////////////////////////////////////////////////////////////////////////////////////// FTimerNodeSortingByTotalExclusiveTime::FTimerNodeSortingByTotalExclusiveTime(TSharedRef InColumnRef) : Insights::FTableCellValueSorter( FName(TEXT("ByTotalExclusiveTime")), LOCTEXT("Sorting_ByTotalExclusiveTime_Name", "By Total Exclusive Time"), LOCTEXT("Sorting_ByTotalExclusiveTime_Title", "Sort By Total Exclusive Time"), LOCTEXT("Sorting_ByTotalExclusiveTime_Desc", "Sort by aggregated total exclusive time."), InColumnRef) { } //////////////////////////////////////////////////////////////////////////////////////////////////// void FTimerNodeSortingByTotalExclusiveTime::Sort(TArray& NodesToSort, Insights::ESortMode SortMode) const { if (SortMode == Insights::ESortMode::Ascending) { NodesToSort.Sort([](const Insights::FBaseTreeNodePtr& A, const Insights::FBaseTreeNodePtr& B) -> bool { ensure(A.IsValid() && A->GetTypeName() == FTimerNode::TypeName); const FTimerNodePtr TimerNodeA = StaticCastSharedPtr(A); const double ValueA = TimerNodeA->GetAggregatedStats().TotalExclusiveTime; ensure(B.IsValid() && B->GetTypeName() == FTimerNode::TypeName); const FTimerNodePtr TimerNodeB = StaticCastSharedPtr(B); const double ValueB = TimerNodeB->GetAggregatedStats().TotalExclusiveTime; if (ValueA == ValueB) { INSIGHTS_DEFAULT_SORTING_NODES(A, B) } else { // Sort by total exclusive time (ascending). return ValueA < ValueB; } }); } else // if (SortMode == ESortMode::Descending) { NodesToSort.Sort([](const Insights::FBaseTreeNodePtr& A, const Insights::FBaseTreeNodePtr& B) -> bool { ensure(A.IsValid() && A->GetTypeName() == FTimerNode::TypeName); const FTimerNodePtr TimerNodeA = StaticCastSharedPtr(A); const double ValueA = TimerNodeA->GetAggregatedStats().TotalExclusiveTime; ensure(B.IsValid() && B->GetTypeName() == FTimerNode::TypeName); const FTimerNodePtr TimerNodeB = StaticCastSharedPtr(B); const double ValueB = TimerNodeB->GetAggregatedStats().TotalExclusiveTime; if (ValueA == ValueB) { INSIGHTS_DEFAULT_SORTING_NODES(A, B) } else { // Sort by total exclusive time (descending). return ValueB < ValueA; } }); } } //////////////////////////////////////////////////////////////////////////////////////////////////// #undef INSIGHTS_DEFAULT_SORTING_NODES #undef LOCTEXT_NAMESPACE