1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2 /*                                                                           */
3 /*                  This file is part of the program and library             */
4 /*         SCIP --- Solving Constraint Integer Programs                      */
5 /*                                                                           */
6 /*    Copyright (C) 2002-2021 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  */
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 */
ObjDialog(SCIP * scip,const char * name,const char * desc,SCIP_Bool issubmenu)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 */
~ObjDialog()79    virtual ~ObjDialog()
80    {
81       /* the macro SCIPfreeMemoryArray does not need the first argument: */
82       /*lint --e{64}*/
83       SCIPfreeMemoryArray(scip_, &scip_name_);
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     */
SCIP_DECL_DIALOGFREE(scip_free)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     */
SCIP_DECL_DIALOGDESC(scip_desc)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