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 objdialog.h
17 * @brief C++ wrapper for dialogs
18 * @author Kati Wolter
19 */
20
21 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
22
23 #ifndef __SCIP_OBJDIALOG_H__
24 #define __SCIP_OBJDIALOG_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 dialogs
36 *
37 * This class defines the interface for dialogs implemented in C++. Note that there is a pure virtual function (this
38 * function has to be implemented). This function is: scip_exec().
39 *
40 * - \ref DIALOG "Instructions for implementing a dialog"
41 * - \ref DIALOGS "List of available dialogs"
42 * - \ref type_dialog.h "Corresponding C interface"
43 */
(1) Event missing_copy_ctor: |
Class "scip::ObjDialog" owns resources that are freed in its destructor but has no user-written copy constructor. |
(2) Event free_resource: |
The destructor frees member "scip_desc_". [details] |
(3) Event free_resource: |
The destructor frees member "scip_name_". [details] |
44 class ObjDialog : public ObjCloneable
45 {
46 public:
47 /*lint --e{1540}*/
48
49 /** SCIP data structure */
50 SCIP* scip_;
51
52 /** name of the dialog */
53 char* scip_name_;
54
55 /** description of the dialog */
56 char* scip_desc_;
57
58 /** default for whether the dialog is a menu */
59 const SCIP_Bool scip_issubmenu_;
60
61 /** default constructor */
62 ObjDialog(
63 SCIP* scip, /**< SCIP data structure */
64 const char* name, /**< name of the dialog */
65 const char* desc, /**< description of the dialog */
66 SCIP_Bool issubmenu /**< default for whether the dialog is a menu */
67 )
68 : scip_(scip),
69 scip_name_(0),
70 scip_desc_(0),
71 scip_issubmenu_(issubmenu)
72 {
73 /* the macro SCIPduplicateMemoryArray does not need the first argument: */
74 SCIP_CALL_ABORT( SCIPduplicateMemoryArray(scip_, &scip_name_, name, std::strlen(name)+1) );
75 SCIP_CALL_ABORT( SCIPduplicateMemoryArray(scip_, &scip_desc_, desc, std::strlen(desc)+1) );
76 }
77
78 /** destructor */
79 virtual ~ObjDialog()
80 {
81 /* the macro SCIPfreeMemoryArray does not need the first argument: */
82 /*lint --e{64}*/
(1) Event freed_arg: |
"BMSfreeMemory_call" frees parameter "this->scip_name_". [details] |
83 SCIPfreeMemoryArray(scip_, &scip_name_);
(1) Event freed_arg: |
"BMSfreeMemory_call" frees parameter "this->scip_desc_". [details] |
84 SCIPfreeMemoryArray(scip_, &scip_desc_);
85 }
86
87 /** destructor of dialog to free user data (called when SCIP is exiting)
88 *
89 * @see SCIP_DECL_DIALOGFREE(x) in @ref type_dialog.h
90 */
91 virtual SCIP_DECL_DIALOGFREE(scip_free)
92 { /*lint --e{715}*/
93 return SCIP_OKAY;
94 }
95
96 /** description output method of dialog
97 *
98 * @see SCIP_DECL_DIALOGDESC(x) in @ref type_dialog.h
99 */
100 virtual SCIP_DECL_DIALOGDESC(scip_desc)
101 { /*lint --e{715}*/
102 SCIPdialogMessage(scip, 0, "%s", scip_desc_);
103 return SCIP_OKAY;
104 }
105
106 /** execution method of dialog
107 *
108 * @see SCIP_DECL_DIALOGEXEC(x) in @ref type_dialog.h
109 */
110 virtual SCIP_DECL_DIALOGEXEC(scip_exec) = 0;
111 };
112
113 } /* namespace scip */
114
115
116
117 /** creates the dialog for the given dialog object and includes it in SCIP
118 *
119 * The method should be called in one of the following ways:
120 *
121 * 1. The user is resposible of deleting the object:
122 * SCIP_CALL( SCIPcreate(&scip) );
123 * ...
124 * MyDialog* mydialog = new MyDialog(...);
125 * SCIP_CALL( SCIPincludeObjDialog(scip, &mydialog, FALSE) );
126 * ...
127 * SCIP_CALL( SCIPfree(&scip) );
128 * delete mydialog; // delete dialog AFTER SCIPfree() !
129 *
130 * 2. The object pointer is passed to SCIP and deleted by SCIP in the SCIPfree() call:
131 * SCIP_CALL( SCIPcreate(&scip) );
132 * ...
133 * SCIP_CALL( SCIPincludeObjDialog(scip, new MyDialog(...), TRUE) );
134 * ...
135 * SCIP_CALL( SCIPfree(&scip) ); // destructor of MyDialog is called here
136 */
137 SCIP_EXPORT
138 SCIP_RETCODE SCIPincludeObjDialog(
139 SCIP* scip, /**< SCIP data structure */
140 scip::ObjDialog* objdialog, /**< dialog object */
141 SCIP_Bool deleteobject /**< should the dialog object be deleted when dialog is freed? */
142 );
143
144 #endif
145