1/* Copyright (C) 2021 Free Software Foundation, Inc.
2   Contributed by Oracle.
3
4   This file is part of GNU Binutils.
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 3, or (at your option)
9   any later version.
10
11   This program is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with this program; if not, write to the Free Software
18   Foundation, 51 Franklin Street - Fifth Floor, Boston,
19   MA 02110-1301, USA.  */
20
21#ifndef _FILTER_H
22#define _FILTER_H
23
24// A sample selection specifies a set of samples the user is interested in
25// viewing as a whole.
26
27#include "vec.h"
28#include "data_pckts.h"
29
30class Experiment;
31
32class FilterNumeric
33{
34public:
35  FilterNumeric (Experiment *, const char *, const char *);
36  ~FilterNumeric ();
37
38  // set or update the range of items first and last
39  void set_range (uint64_t findex, uint64_t lindex, uint64_t total);
40
41  // Return a string representation of the current ranges
42  //	E.g. "1-5,7,9,10,12-13,73"
43  char *get_pattern ();
44
45  // Return a string for the current status: %, range, ...
46  //	E.g. "100%" "100% [1-7]"  "25% [1-4]"
47  char *get_status ();
48
49  char *get_advanced_filter ();
50
51  // Sets selection according to the string representation
52  // See above for return values and error handling
53  bool set_pattern (char *, bool *);
54
55    // Return true if "number" is included in selection
56  bool is_selected (uint64_t number);
57
58  char *
59  get_cmd ()
60  {
61    return cmd;
62  };
63
64  char *
65  get_name ()
66  {
67    return name;
68  };
69
70  uint64_t
71  nelem ()
72  {
73    return nitems;
74  };
75
76  char *prop_name; // name in advanced filter
77
78private:
79
80  typedef struct
81  {
82    uint64_t first;
83    uint64_t last;
84  } RangePair;
85
86  void update_status ();
87  void update_range ();
88
89  // Include "range" in selection
90  bool include_range (uint64_t findex, uint64_t lindex);
91
92  // Parse a number from the string
93  uint64_t get_next_number (char *s, char **e, bool *fail);
94
95  // Data
96  Vector<RangePair *> *items; // sorted array of items
97  uint64_t nselected;
98  uint64_t nitems;
99
100  Experiment *exp;
101  char *cmd;
102  char *name;
103  char *pattern;
104  char *status;
105
106  // First and Last items in selection
107  uint64_t first;
108  uint64_t last;
109};
110
111#endif /* _FILTER_H */
112