1 /* 2 * Copyright (C) 2024 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.tools 18 19 interface Trace<Entry : TraceEntry> { 20 val entries: Collection<Entry> 21 22 /** @return a slice inclusive of both start and end timestamp */ slicenull23 fun slice(startTimestamp: Timestamp, endTimestamp: Timestamp): Trace<Entry> 24 25 /** 26 * @return an entry that matches exactly [timestamp] 27 * @throws if there is no entry in the trace at [timestamp] 28 */ 29 fun getEntryExactlyAt(timestamp: Timestamp): Entry { 30 return entries.firstOrNull { it.timestamp == timestamp } 31 ?: throw RuntimeException("Entry does not exist for timestamp $timestamp") 32 } 33 34 /** 35 * @return the entry that is "active' at [timestamp] 36 * 37 * ``` 38 * (the entry at [timestamp] or the one before it if no entry exists at [timestamp]) 39 * @throws if 40 * ``` 41 * 42 * the provided [timestamp] is before all entries in the trace 43 */ getEntryAtnull44 fun getEntryAt(timestamp: Timestamp): Entry { 45 return entries.toList().dropLastWhile { it.timestamp > timestamp }.lastOrNull() 46 ?: error("No entry at or before timestamp $timestamp") 47 } 48 } 49