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_assign: Class "scip::ObjDialog" owns resources that are freed in its destructor but has no user-written assignment operator.
(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