1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2 /* */
3 /* This file is part of the program and library */
4 /* SCIP --- Solving Constraint Integer Programs */
5 /* */
6 /* Copyright (C) 2002-2022 Konrad-Zuse-Zentrum */
7 /* fuer Informationstechnik Berlin */
8 /* */
9 /* SCIP is distributed under the terms of the ZIB Academic License. */
10 /* */
11 /* You should have received a copy of the ZIB Academic License. */
12 /* along with SCIP; see the file COPYING. If not visit scipopt.org. */
13 /* */
14 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
15
16 /**@file objdisp.h
17 * @brief C++ wrapper for display columns
18 * @author Kati Wolter
19 */
20
21 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
22
23 #ifndef __SCIP_OBJDISP_H__
24 #define __SCIP_OBJDISP_H__
25
26 #include <cstring>
27
28 #include "scip/scip.h"
29 #include "objscip/objcloneable.h"
30
31 namespace scip
32 {
33
34 /**
35 * @brief C++ wrapper for display columns
36 *
37 * This class defines the interface for display columns implemented in C++. Note that there is a pure virtual function
38 * (this function has to be implemented). This function is: scip_output().
39 *
40 * - \ref DISP "Instructions for implementing a display column"
41 * - \ref DISPLAYS "List of available display columns"
42 * - \ref type_disp.h "Corresponding C interface"
43 */
(1) Event missing_copy_ctor: |
Class "scip::ObjDisp" owns resources that are freed in its destructor but has no user-written copy constructor. |
(2) Event free_resource: |
The destructor frees member "scip_header_". [details] |
(3) Event free_resource: |
The destructor frees member "scip_desc_". [details] |
(4) Event free_resource: |
The destructor frees member "scip_name_". [details] |
44 class ObjDisp : public ObjCloneable
45 {
46 public:
47 /*lint --e{1540}*/
48
49 /** SCIP data structure */
50 SCIP* scip_;
51
52 /** name of the display column */
53 char* scip_name_;
54
55 /** description of the display column */
56 char* scip_desc_;
57
58 /** head line of the display column */
59 char* scip_header_;
60
61 /** width of the display column (no. of chars used) */
62 const int scip_width_;
63
64 /** priority of the display column */
65 const int scip_priority_;
66
67 /** relative position of the display column */
68 const int scip_position_;
69
70 /** should the column be separated with a line from its right neighbour? */
71 const SCIP_Bool scip_stripline_;
72
73 /** default constructor */
74 ObjDisp(
75 SCIP* scip, /**< SCIP data structure */
76 const char* name, /**< name of display column */
77 const char* desc, /**< description of display column */
78 const char* header, /**< head line of display column */
79 int width, /**< width of display column (no. of chars used) */
80 int priority, /**< priority of display column */
81 int position, /**< relative position of display column */
82 SCIP_Bool stripline /**< should the column be separated with a line from its right neighbour? */
83 )
84 : scip_(scip),
85 scip_name_(0),
86 scip_desc_(0),
87 scip_header_(0),
88 scip_width_(width),
89 scip_priority_(priority),
90 scip_position_(position),
91 scip_stripline_(stripline)
92 {
93 /* the macro SCIPduplicateMemoryArray does not need the first argument: */
94 SCIP_CALL_ABORT( SCIPduplicateMemoryArray(scip_, &scip_name_, name, std::strlen(name)+1) );
95 SCIP_CALL_ABORT( SCIPduplicateMemoryArray(scip_, &scip_desc_, desc, std::strlen(desc)+1) );
96 SCIP_CALL_ABORT( SCIPduplicateMemoryArray(scip_, &scip_header_, header, std::strlen(header)+1) );
97 }
98
99 /** destructor */
100 virtual ~ObjDisp()
101 {
102 /* the macro SCIPfreeMemoryArray does not need the first argument: */
103 /*lint --e{64}*/
(1) Event freed_arg: |
"BMSfreeMemory_call" frees parameter "this->scip_name_". [details] |
104 SCIPfreeMemoryArray(scip_, &scip_name_);
(1) Event freed_arg: |
"BMSfreeMemory_call" frees parameter "this->scip_desc_". [details] |
105 SCIPfreeMemoryArray(scip_, &scip_desc_);
(1) Event freed_arg: |
"BMSfreeMemory_call" frees parameter "this->scip_header_". [details] |
106 SCIPfreeMemoryArray(scip_, &scip_header_);
107 }
108
109 /** destructor of display column to free user data (called when SCIP is exiting)
110 *
111 * @see SCIP_DECL_DISPFREE(x) in @ref type_disp.h
112 */
113 virtual SCIP_DECL_DISPFREE(scip_free)
114 { /*lint --e{715}*/
115 return SCIP_OKAY;
116 }
117
118 /** initialization method of display column (called after problem was transformed)
119 *
120 * @see SCIP_DECL_DISPINIT(x) in @ref type_disp.h
121 */
122 virtual SCIP_DECL_DISPINIT(scip_init)
123 { /*lint --e{715}*/
124 return SCIP_OKAY;
125 }
126
127 /** deinitialization method of display column (called before transformed problem is freed)
128 *
129 * @see SCIP_DECL_DISPEXIT(x) in @ref type_disp.h
130 */
131 virtual SCIP_DECL_DISPEXIT(scip_exit)
132 { /*lint --e{715}*/
133 return SCIP_OKAY;
134 }
135
136 /** solving process initialization method of display column (called when branch and bound process is about to begin)
137 *
138 * @see SCIP_DECL_DISPINITSOL(x) in @ref type_disp.h
139 */
140 virtual SCIP_DECL_DISPINITSOL(scip_initsol)
141 { /*lint --e{715}*/
142 return SCIP_OKAY;
143 }
144
145 /** solving process deinitialization method of display column (called before branch and bound process data is freed)
146 *
147 * @see SCIP_DECL_DISPEXITSOL(x) in @ref type_disp.h
148 */
149 virtual SCIP_DECL_DISPEXITSOL(scip_exitsol)
150 { /*lint --e{715}*/
151 return SCIP_OKAY;
152 }
153
154 /** output method of display column to output file stream 'file'
155 *
156 * @see SCIP_DECL_DISPOUTPUT(x) in @ref type_disp.h
157 */
158 virtual SCIP_DECL_DISPOUTPUT(scip_output) = 0;
159 };
160
161 } /* namespace scip */
162
163
164
165 /** creates the display column for the given display column object and includes it in SCIP
166 *
167 * The method should be called in one of the following ways:
168 *
169 * 1. The user is resposible of deleting the object:
170 * SCIP_CALL( SCIPcreate(&scip) );
171 * ...
172 * MyDisp* mydisp = new MyDisp(...);
173 * SCIP_CALL( SCIPincludeObjDisp(scip, &mydisp, FALSE) );
174 * ...
175 * SCIP_CALL( SCIPfree(&scip) );
176 * delete mydisp; // delete disp AFTER SCIPfree() !
177 *
178 * 2. The object pointer is passed to SCIP and deleted by SCIP in the SCIPfree() call:
179 * SCIP_CALL( SCIPcreate(&scip) );
180 * ...
181 * SCIP_CALL( SCIPincludeObjDisp(scip, new MyDisp(...), TRUE) );
182 * ...
183 * SCIP_CALL( SCIPfree(&scip) ); // destructor of MyDisp is called here
184 */
185 SCIP_EXPORT
186 SCIP_RETCODE SCIPincludeObjDisp(
187 SCIP* scip, /**< SCIP data structure */
188 scip::ObjDisp* objdisp, /**< display column object */
189 SCIP_Bool deleteobject /**< should the display column object be deleted when display column is freed? */
190 );
191
192 /** returns the display column object of the given name, or 0 if not existing */
193 SCIP_EXPORT
194 scip::ObjDisp* SCIPfindObjDisp(
195 SCIP* scip, /**< SCIP data structure */
196 const char* name /**< name of display column */
197 );
198
199 /** returns the display column object for the given display column */
200 SCIP_EXPORT
201 scip::ObjDisp* SCIPgetObjDisp(
202 SCIP* scip, /**< SCIP data structure */
203 SCIP_DISP* disp /**< display column */
204 );
205
206 #endif
207