X-Git-Url: https://git.cworth.org/git?p=apitrace;a=blobdiff_plain;f=common%2Ftrace_callset.hpp;h=a2f82134c558972eca41c090d660f4470a8105f1;hp=b679d94867b3f095f78b574e07c4075deccafc7e;hb=ec8f5a61f393e75e4c3e3e22f84c773af66810e9;hpb=2ae3c962d308ceb866f7478866cdcc85f50a987d diff --git a/common/trace_callset.hpp b/common/trace_callset.hpp index b679d94..a2f8213 100644 --- a/common/trace_callset.hpp +++ b/common/trace_callset.hpp @@ -48,6 +48,7 @@ #define _TRACE_CALLSET_HPP_ +#include #include #include "trace_model.hpp" @@ -55,11 +56,6 @@ namespace trace { - - // Should match Call::no - typedef unsigned CallNo; - - // Aliases for call flags enum { FREQUENCY_NONE = 0, @@ -106,12 +102,15 @@ namespace trace { // A collection of call ranges class CallSet { + private: + CallRange limits; + public: // TODO: use binary tree to speed up lookups typedef std::list< CallRange > RangeList; RangeList ranges; - CallSet() {} + CallSet(): limits(std::numeric_limits::min(), std::numeric_limits::max()) {} CallSet(CallFlags freq); @@ -128,6 +127,16 @@ namespace trace { if (range.start <= range.stop && range.freq != FREQUENCY_NONE) { + if (empty()) { + limits.start = range.start; + limits.stop = range.stop; + } else { + if (range.start < limits.start) + limits.start = range.start; + if (range.stop > limits.stop) + limits.stop = range.stop; + } + RangeList::iterator it = ranges.begin(); while (it != ranges.end() && it->start < range.start) { ++it; @@ -155,6 +164,14 @@ namespace trace { contains(const trace::Call &call) { return contains(call.no, call.flags); } + + CallNo getFirst() { + return limits.start; + } + + CallNo getLast() { + return limits.stop; + } };