Arkanjo 0.2
A tool for find code duplicated functions in codebases
Loading...
Searching...
No Matches
counter_duplication_code_trie.cpp
Go to the documentation of this file.
1/*
2This is a Trie with a element being a folder to enable count of duplication code in the scope of files.
3It is not simple to understand if you do not know the structure. Please refer to https://en.wikipedia.org/wiki/Trie .
4*/
7
8Utils::COLOR CounterDuplicationCodeTrie::choose_text_color() {
9 number_printed_lines++;
11 if (number_printed_lines % 2 == 0) {
12 ret = Utils::BLUE;
13 }
14 return ret;
15}
16
17int CounterDuplicationCodeTrie::create_node_at_the_end() {
18 int id = trie.size();
19 std::map<std::string, int> aux;
20 trie.push_back(aux);
21 counter_duplication_lines.push_back(ZERO_INITIAL_COUNTER);
22 return id;
23}
24
25void CounterDuplicationCodeTrie::create_edge_if_not_exist(int node, const std::string& folder) {
26 if (trie[node].find(folder) == trie[node].end()) {
27 trie[node][folder] = create_node_at_the_end();
28 }
29}
30
31std::string CounterDuplicationCodeTrie::create_context_string_on_depth(int depth) {
32 std::string ret = "";
33 for (int i = 0; i < depth; i++) {
34 ret += BASIC_SHIFT_PER_DEPTH;
35 }
36 ret += END_ARROW;
37 return ret;
38}
39
40void CounterDuplicationCodeTrie::print_node_information(int node, int depth, const std::string& folder) {
41 std::string line = create_context_string_on_depth(depth) + folder + TWO_POINTER_AFTER_FOLDER;
42 line += std::to_string(counter_duplication_lines[node]) + LINE_TEXT;
43
44 std::cout << FormatterManager::get_formatter()->colorize(line, choose_text_color()) << '\n';
45}
46
47void CounterDuplicationCodeTrie::dfs_print_duplication_code_trie(int current_node, int depth, const std::string& folder) {
48 print_node_information(current_node, depth, folder);
49 for (auto [child_folder, child_node] : trie[current_node]) {
50 int child_depth = depth + 1;
51 dfs_print_duplication_code_trie(child_node, child_depth, child_folder);
52 }
53}
54
55void CounterDuplicationCodeTrie::add_folder_duplication_code(const std::vector<std::string>& folder_path, int number_of_duplication_lines) {
56 int current_node = ROOT_NODE;
57 counter_duplication_lines[current_node] += number_of_duplication_lines;
58 for (const auto& folder : folder_path) {
59 create_edge_if_not_exist(current_node, folder);
60 current_node = trie[current_node][folder];
61 counter_duplication_lines[current_node] += number_of_duplication_lines;
62 }
63}
64
66 dfs_print_duplication_code_trie(ROOT_NODE, BASE_DEPTH, EMPTY_FOLDER);
67}
68
70 create_node_at_the_end();
71}
void add_folder_duplication_code(const std::vector< std::string > &folder_path, int number_of_duplication_lines)
Adds duplication count for a folder path.
CounterDuplicationCodeTrie()
Constructs a new trie with root node.
void print_duplication_code_trie()
Prints the trie structure with duplication counts.
static std::shared_ptr< IFormatter > get_formatter()
Trie-based code duplication counter.
COLOR
Enumeration of available colors for formatted messages.
Definition utils.hpp:111
@ BLACK
Black color.
Definition utils.hpp:122
@ BLUE
Blue color.
Definition utils.hpp:116