1 /**************************************************************************
3 * Copyright 2012 VMware, Inc.
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 **************************************************************************/
27 * Representation of call sets.
32 * | range ( ',' ? range ) *
34 * range = interval ( '/' frequency )
38 * | start_number '-' end_number
42 * | "rendertarget" | "fbo"
47 #ifndef _TRACE_CALLSET_HPP_
48 #define _TRACE_CALLSET_HPP_
54 #include "trace_model.hpp"
55 #include "trace_fast_callset.hpp"
59 // Aliases for call flags
62 FREQUENCY_FRAME = CALL_FLAG_END_FRAME,
63 FREQUENCY_RENDERTARGET = CALL_FLAG_END_FRAME | CALL_FLAG_SWAP_RENDERTARGET,
64 FREQUENCY_RENDER = CALL_FLAG_RENDER,
65 FREQUENCY_ALL = 0xffffffff
68 // A linear range of calls
77 CallRange(CallNo callNo) :
84 CallRange(CallNo _start, CallNo _stop, CallNo _step = 1, CallFlags _freq = FREQUENCY_ALL) :
92 contains(CallNo callNo, CallFlags callFlags) const {
93 return callNo >= start &&
95 ((callNo - start) % step) == 0 &&
96 ((callFlags & freq) ||
97 freq == FREQUENCY_ALL);
102 // A collection of call ranges
109 FastCallSet fast_call_set;
111 // TODO: use binary tree to speed up lookups, (less important
112 // now that we are using FastCallSet for ranges without step
114 typedef std::list< CallRange > RangeList;
117 CallSet(): limits(std::numeric_limits<CallNo>::min(), std::numeric_limits<CallNo>::max()) {}
119 CallSet(CallFlags freq);
121 CallSet(const char *str);
126 return fast_call_set.empty() && ranges.empty();
130 addRange(const CallRange & range) {
131 if (range.start <= range.stop &&
132 range.freq != FREQUENCY_NONE) {
135 limits.start = range.start;
136 limits.stop = range.stop;
138 if (range.start < limits.start)
139 limits.start = range.start;
140 if (range.stop > limits.stop)
141 limits.stop = range.stop;
144 /* Optimize by using fast_call_set whenever possible */
145 if (range.step == 1 && range.freq == FREQUENCY_ALL) {
146 fast_call_set.add(range.start, range.stop);
148 RangeList::iterator it = ranges.begin();
149 while (it != ranges.end() && it->start < range.start) {
153 ranges.insert(it, range);
159 contains(CallNo callNo, CallFlags callFlags = FREQUENCY_ALL) const {
163 if (fast_call_set.contains(callNo))
165 RangeList::const_iterator it;
166 for (it = ranges.begin(); it != ranges.end() && it->start <= callNo; ++it) {
167 if (it->contains(callNo, callFlags)) {
175 contains(const trace::Call &call) {
176 return contains(call.no, call.flags);
189 CallSet parse(const char *string);
192 } /* namespace trace */
195 #endif /* _TRACE_CALLSET_HPP_ */