Files
UnrealEngineUWP/Engine/Source/Developer/TraceServices/Private/Model/Bookmarks.cpp
Martin Ridgers 5208379ed7 Moved the TraceServices module into its own namespace.
#rb im
#rnx

[CL 14743799 by Martin Ridgers in ue5-main branch]
2020-11-13 05:29:37 -04:00

89 lines
2.4 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "TraceServices/Model/Bookmarks.h"
#include "Model/BookmarksPrivate.h"
#include "AnalysisServicePrivate.h"
#include "Common/FormatArgs.h"
namespace TraceServices
{
const FName FBookmarkProvider::ProviderName("BookmarkProvider");
FBookmarkProvider::FBookmarkProvider(IAnalysisSession& InSession)
: Session(InSession)
{
}
FBookmarkSpec& FBookmarkProvider::GetSpec(uint64 BookmarkPoint)
{
Session.WriteAccessCheck();
if (SpecMap.Contains(BookmarkPoint))
{
return *SpecMap[BookmarkPoint].Get();
}
else
{
TSharedPtr<FBookmarkSpec> Spec = MakeShared<FBookmarkSpec>();
Spec->File = TEXT("<unknown>");
Spec->FormatString = TEXT("<unknown>");
SpecMap.Add(BookmarkPoint, Spec);
return *Spec.Get();
}
}
void FBookmarkProvider::AppendBookmark(double Time, uint64 BookmarkPoint, const uint8* FormatArgs)
{
Session.WriteAccessCheck();
FBookmarkSpec& Spec = GetSpec(BookmarkPoint);
TSharedRef<FBookmarkInternal> Bookmark = MakeShared<FBookmarkInternal>();
Bookmark->Time = Time;
FFormatArgsHelper::Format(FormatBuffer, FormatBufferSize - 1, TempBuffer, FormatBufferSize - 1, Spec.FormatString, FormatArgs);
Bookmark->Text = Session.StoreString(FormatBuffer);
Bookmarks.Add(Bookmark);
Session.UpdateDurationSeconds(Time);
}
void FBookmarkProvider::EnumerateBookmarks(double IntervalStart, double IntervalEnd, TFunctionRef<void(const FBookmark &)> Callback) const
{
Session.ReadAccessCheck();
if (IntervalStart > IntervalEnd)
{
return;
}
uint64 FirstBookmarkIndex = Algo::LowerBoundBy(Bookmarks, IntervalStart, [](const TSharedRef<FBookmarkInternal>& B)
{
return B->Time;
});
uint64 BookmarkCount = Bookmarks.Num();
if (FirstBookmarkIndex >= BookmarkCount)
{
return;
}
uint64 LastBookmarkIndex = Algo::UpperBoundBy(Bookmarks, IntervalEnd, [](const TSharedRef<FBookmarkInternal>& B)
{
return B->Time;
});
if (LastBookmarkIndex == 0)
{
return;
}
--LastBookmarkIndex;
for (uint64 Index = FirstBookmarkIndex; Index <= LastBookmarkIndex; ++Index)
{
const FBookmarkInternal& InternalBookmark = Bookmarks[Index].Get();
FBookmark Bookmark;
Bookmark.Time = InternalBookmark.Time;
Bookmark.Text = InternalBookmark.Text;
Callback(Bookmark);
}
}
const IBookmarkProvider& ReadBookmarkProvider(const IAnalysisSession& Session)
{
return *Session.ReadProvider<IBookmarkProvider>(FBookmarkProvider::ProviderName);
}
} // namespace TraceServices