-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcpp_class_gen.py
More file actions
140 lines (112 loc) · 4.06 KB
/
cpp_class_gen.py
File metadata and controls
140 lines (112 loc) · 4.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import os
import sys
def generate_class_files(class_names, output_dir):
# Create the specified output directory if it doesn't exist
os.makedirs(output_dir, exist_ok=True)
first_template_hpp = """\
#ifndef {guard}
# define {guard}
# include <iostream>
# include <string.h>
# include <unistd.h>
# include <cstdlib>
# include <ctime>
# define RED "\\033[31m"
# define GREEN "\\033[32m"
# define PURPLE "\\033[35m"
# define YELLOW "\\033[33m"
# define WHITE "\\033[37m"
# define CYAN "\\033[36m"
# define BOLD_RED "\\033[1;31m"
# define BOLD_GREEN "\\033[1;32m"
# define BOLD_PURPLE "\\033[1;35m"
# define BOLD_YELLOW "\\033[1;33m"
# define BOLD_WHITE "\\033[1;37m"
# define BOLD_CYAN "\\033[1;36m"
# define RESET "\\033[0m"
class {class_name} {{
public:
{class_name}(); // Constructor
{class_name}(const {class_name}& copy);//Copy constructor
{class_name}& operator= (const {class_name}& copy); //Copy assignment constructor
~{class_name}(); // Destructor
private:
// Add private members here
}};
#endif // {guard}
"""
template_hpp = """\
#ifndef {guard}
# define {guard}
# include "{last_class_name}.hpp"
class {class_name} {{
public:
{class_name}(); // Constructor
{class_name}(const {class_name}& copy);//Copy constructor
{class_name}& operator= (const {class_name}& copy); //Copy assignment constructor
~{class_name}(); // Destructor
private:
// Add private members here
}};
#endif // {guard}
"""
template_cpp = """\
#include "{includes_dir}/{class_name}.hpp"
{class_name}::{class_name}() {{
std::cout << BOLD_WHITE << "{class_name}" << RESET
<< " default constructor called" << std::endl;
}}
// Copy constructor
{class_name}::{class_name}(const {class_name}& copy) {{
// Copy stuff
std::cout << BOLD_WHITE << "{class_name}" << RESET
<< " copy constructor called" << std::endl;
}}
// Copy assignment operator overload
{class_name}& {class_name}::operator= (const {class_name}& copy) {{
// Self-assignment check
if (this == ©)
return *this;
// Copy stuff
std::cout << BOLD_WHITE << "{class_name}" << RESET
<< " copy assignment operator overload" << std::endl;
return *this;
}}
{class_name}::~{class_name}() {{
std::cout << BOLD_WHITE << "{class_name}" << RESET
<< " destructor called" << std::endl;
}}
"""
last_class_name = None
for index, class_name in enumerate(class_names):
# Prepare file names and content
header_filename = os.path.join(output_dir, "includes", f"{class_name}.hpp")
cpp_filename = os.path.join(output_dir, f"{class_name}.cpp")
guard_name = f"{class_name.upper()}_HPP" # Header guard name
if index == 0:
header_content = first_template_hpp.format(class_name=class_name, guard=guard_name)
else:
header_content = template_hpp.format(
class_name=class_name,
guard=guard_name,
last_class_name=last_class_name if last_class_name else'')
cpp_content = template_cpp.format(class_name=class_name, includes_dir="includes")
# Write header file into 'includes' directory under the specified output directory
os.makedirs(os.path.dirname(header_filename), exist_ok=True)
with open(header_filename, "w") as header_file:
header_file.write(header_content)
print(f"Generated {header_filename}")
# Write cpp file under the specified output directory
with open(cpp_filename, "w") as cpp_file:
cpp_file.write(cpp_content)
print(f"Generated {cpp_filename}")
last_class_name = class_name
print("All files generated successfully.")
if __name__ == "__main__":
# Read class names from command-line arguments
class_names = sys.argv[1:-1] # All but the last argument
output_directory = sys.argv[-1] # Last argument is the output directory
if len(class_names) < 1 or not output_directory:
print("Usage: python3 cppClassGenerator.py ClassName1 ClassName2 ... OutputDirectory")
sys.exit(1)
generate_class_files(class_names, output_directory)