libabigail
abg-comp-filter.h
Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
2 // -*- Mode: C++ -*-
3 //
4 // Copyright (C) 2013-2023 Red Hat, Inc.
5 //
6 // Author: Dodji Seketeli
7 
8 /// @file
9 ///
10 /// This header declares filters for the diff trees resulting from
11 /// comparing ABI Corpora.
12 
13 #ifndef __ABG_COMP_FILTER_H__
14 #define __ABG_COMP_FILTER_H__
15 
16 #include "abg-comparison.h"
17 
18 namespace abigail
19 {
20 namespace comparison
21 {
22 /// Facilities to walk, categorize and possibly filter nodes of the
23 /// diff tree.
24 namespace filtering
25 {
26 
27 bool
28 has_harmless_name_change(const decl_base_sptr& f, const decl_base_sptr& s);
29 
30 bool union_diff_has_harmless_changes(const diff *d);
31 
32 bool
33 has_harmful_name_change(const decl_base_sptr& f, const decl_base_sptr& s);
34 
35 bool
36 has_harmful_name_change(const diff* dif);
37 
38 bool
39 has_virtual_mem_fn_change(const function_decl_diff* diff);
40 
41 bool
42 is_decl_only_class_with_size_change(const class_or_union& first,
43  const class_or_union& second);
44 
45 bool
46 is_decl_only_class_with_size_change(const class_or_union_sptr& first,
47  const class_or_union_sptr& second);
48 
49 bool
50 is_decl_only_class_with_size_change(const diff *diff);
51 
52 bool
53 has_decl_only_def_change(const decl_base_sptr& first,
54  const decl_base_sptr& second);
55 
56 bool
57 has_decl_only_def_change(const diff *d);
58 
59 bool
60 has_class_decl_only_def_change(const class_or_union_sptr& first,
61  const class_or_union_sptr& second);
62 
63 bool
65  const enum_type_decl_sptr& second);
66 
67 bool
68 has_class_decl_only_def_change(const diff *diff);
69 
70 bool
71 has_enum_decl_only_def_change(const diff *diff);
72 
73 bool
74 has_basic_type_name_change(const diff *);
75 
76 bool
78 
79 bool
81 
82 bool
83 is_mostly_distinct_diff(const diff *d);
84 
85 bool
87 
88 bool
90 
91 bool
92 has_data_member_replaced_by_anon_dm(const diff* diff);
93 
94 bool
96 
97 bool
99  const var_decl_sptr& var2);
100 
101 struct filter_base;
102 /// Convenience typedef for a shared pointer to filter_base
103 typedef shared_ptr<filter_base> filter_base_sptr;
104 /// Convenience typedef for a vector of filter_base_sptr
105 typedef std::vector<filter_base_sptr> filters;
106 
107 /// The base class for the diff tree node filter.
108 ///
109 /// It's intended to walk a tree of diff nodes and tag each relevant
110 /// name into one or several categories depending on well choosen
111 /// properties of the diff nodes.
113 {
114  friend void
116 }; //end class filter_base
117 
118 void
120 
121 void
123 
124 void
126 
127 class harmless_filter;
128 /// Convenience typedef for a shared pointer to a harmless_filter.
129 typedef shared_ptr<harmless_filter> harmless_filter_sptr;
130 
131 /// A filter that walks the diff nodes tree and tags relevant diff
132 /// nodes into categories considered to represent harmless changes.
134 {
135  virtual bool
136  visit(diff*, bool);
137 
138  virtual void
139  visit_end(diff*);
140 }; // end class harmless_filter
141 
143 /// A convenience typedef for a shared pointer to harmful_filter.
144 typedef shared_ptr<harmless_harmful_filter> harmful_harmless_filter_sptr;
145 
146 /// A filter that walks the diff nodes tree and tags relevant diff
147 /// nodes into categories considered to represent potentially harmless
148 /// or harmful changes.
150 {
151  virtual bool
152  visit(diff*, bool);
153 
154  virtual void
155  visit_end(diff*);
156 }; // end class harmless_harmful_filter
157 
158 } // end namespace filtering
159 } // end namespace comparison
160 } // end namespace abigail
161 
162 #endif // __ABG_COMP_FILTER_H__
The base class for the node visitors. These are the types used to visit each node traversed by the di...
The abstraction of a change between two ABI artifacts, a.k.a an artifact change.
A filter that walks the diff nodes tree and tags relevant diff nodes into categories considered to re...
A filter that walks the diff nodes tree and tags relevant diff nodes into categories considered to re...
bool has_basic_type_name_change(const diff *d)
Test if a diff node carries a basic type name change.
bool has_enum_decl_only_def_change(const enum_type_decl_sptr &first, const enum_type_decl_sptr &second)
Test if two enum_sptr are different just by the fact that one is decl-only and the other one is defin...
std::vector< filter_base_sptr > filters
Convenience typedef for a vector of filter_base_sptr.
bool has_class_decl_only_def_change(const class_or_union_sptr &first, const class_or_union_sptr &second)
Test if two class_or_union_sptr are different just by the fact that one is decl-only and the other on...
bool has_data_member_replaced_by_anon_dm(const diff *diff)
Test if a class_or_union_diff has a data member replaced by an anonymous data member in a harmless wa...
bool has_harmless_name_change(const decl_base_sptr &f, const decl_base_sptr &s)
Test if two decls represents a harmless name change.
shared_ptr< harmless_harmful_filter > harmful_harmless_filter_sptr
A convenience typedef for a shared pointer to harmful_filter.
bool is_var_1_dim_unknown_size_array_change(const var_decl_sptr &var1, const var_decl_sptr &var2)
Test if we are looking at two variables which types are both one dimension array, with one of them be...
bool is_decl_only_class_with_size_change(const class_or_union &first, const class_or_union &second)
Test if two classes that are decl-only (have the decl-only flag and carry no data members) but are di...
bool has_virtual_mem_fn_change(const function_decl_diff *diff)
Test if the function_decl_diff node has a change involving virtual member functions.
shared_ptr< filter_base > filter_base_sptr
Convenience typedef for a shared pointer to filter_base.
bool has_harmful_name_change(const decl_base_sptr &f, const decl_base_sptr &s)
Test if two decls represents a harmful name change.
bool has_class_or_union_type_name_change(const diff *d)
Test if a diff node carries a class or union type name change.
bool has_decl_only_def_change(const decl_base_sptr &first, const decl_base_sptr &second)
Test if two decl_base_sptr are different just by the fact that one is decl-only and the other one is ...
bool has_basic_or_class_type_name_change(const diff *d)
Test if a diff node carries a basic or class type name change.
shared_ptr< harmless_filter > harmless_filter_sptr
Convenience typedef for a shared pointer to a harmless_filter.
bool has_anonymous_data_member_change(const diff *d)
Test if a diff node carries a non-anonymous data member to anonymous data member change,...
void apply_filter(filter_base &filter, corpus_diff_sptr d)
Walk the diff sub-trees of a a corpus_diff and apply a filter to the nodes visted....
bool is_mostly_distinct_diff(const diff *d)
Test if a diff node carries a distinct type change or a pointer/reference/typedef to distinct type ch...
bool union_diff_has_harmless_changes(const diff *d)
Test if a union diff node does have changes that don't impact its size.
shared_ptr< diff > diff_sptr
Convenience typedef for a shared_ptr for the diff class.
Definition: abg-fwd.h:76
shared_ptr< corpus_diff > corpus_diff_sptr
A convenience typedef for a shared pointer to corpus_diff.
shared_ptr< var_decl > var_decl_sptr
Convenience typedef for a shared pointer on a var_decl.
Definition: abg-fwd.h:246
shared_ptr< enum_type_decl > enum_type_decl_sptr
Convenience typedef for shared pointer to a enum_type_decl.
Definition: abg-fwd.h:169
Toplevel namespace for libabigail.
The base class for the diff tree node filter.
friend void apply_filter(filter_base_sptr f, diff_sptr deef)
Walk a diff sub-tree and apply a filter to the nodes visted. The filter categorizes each node,...