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 objreader.h
17 * @brief C++ wrapper for file readers and writers
18 * @author Tobias Achterberg
19 */
20
21 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
22
23 #ifndef __SCIP_OBJREADER_H__
24 #define __SCIP_OBJREADER_H__
25
26 #include <cstring>
27
28 #include "scip/scip.h"
29 #include "objscip/objcloneable.h"
30
31 namespace scip
32 {
33
34 /** @brief C++ wrapper for file readers and writers
35 *
36 * This class defines the interface for file readers and writers implemented in C++.
37 *
38 * - \ref READER "Instructions for implementing a file reader and writer"
39 * - \ref FILEREADERS "List of available file readers and writers"
40 * - \ref type_reader.h "Corresponding C interface"
41 */
(1) Event missing_assign: |
Class "scip::ObjReader" owns resources that are freed in its destructor but has no user-written assignment operator. |
(2) Event free_resource: |
The destructor frees member "scip_extension_". [details] |
(3) Event free_resource: |
The destructor frees member "scip_desc_". [details] |
(4) Event free_resource: |
The destructor frees member "scip_name_". [details] |
42 class ObjReader : public ObjCloneable
43 {
44 public:
45 /*lint --e{1540}*/
46
47 /** SCIP data structure */
48 SCIP* scip_;
49
50 /** name of the file reader */
51 char* scip_name_;
52
53 /** description of the file reader */
54 char* scip_desc_;
55
56 /** file extension that reader processes */
57 char* scip_extension_;
58
59 /** default constructor */
60 ObjReader(
61 SCIP* scip, /**< SCIP data structure */
62 const char* name, /**< name of file reader */
63 const char* desc, /**< description of file reader */
64 const char* extension /**< file extension that reader processes */
65 )
66 : scip_(scip),
67 scip_name_(0),
68 scip_desc_(0),
69 scip_extension_(0)
70 {
71 /* the macro SCIPduplicateMemoryArray does not need the first argument: */
72 SCIP_CALL_ABORT( SCIPduplicateMemoryArray(scip_, &scip_name_, name, std::strlen(name)+1) );
73 SCIP_CALL_ABORT( SCIPduplicateMemoryArray(scip_, &scip_desc_, desc, std::strlen(desc)+1) );
74 SCIP_CALL_ABORT( SCIPduplicateMemoryArray(scip_, &scip_extension_, extension, std::strlen(extension)+1) );
75 }
76
77 /** destructor */
78 virtual ~ObjReader()
79 {
80 /* the macro SCIPfreeMemoryArray does not need the first argument: */
81 /*lint --e{64}*/
(1) Event freed_arg: |
"BMSfreeMemory_call" frees parameter "this->scip_name_". [details] |
82 SCIPfreeMemoryArray(scip_, &scip_name_);
(1) Event freed_arg: |
"BMSfreeMemory_call" frees parameter "this->scip_desc_". [details] |
83 SCIPfreeMemoryArray(scip_, &scip_desc_);
(1) Event freed_arg: |
"BMSfreeMemory_call" frees parameter "this->scip_extension_". [details] |
84 SCIPfreeMemoryArray(scip_, &scip_extension_);
85 }
86
87 /** destructor of file reader to free user data (called when SCIP is exiting)
88 *
89 * @see SCIP_DECL_READERFREE(x) in @ref type_reader.h
90 */
91 virtual SCIP_DECL_READERFREE(scip_free)
92 { /*lint --e{715}*/
93 return SCIP_OKAY;
94 }
95
96 /** problem reading method of reader
97 *
98 * @see SCIP_DECL_READERREAD(x) in @ref type_reader.h
99 */
100 virtual SCIP_DECL_READERREAD(scip_read)
101 { /*lint --e{715}*/
102
103 /* set result pointer to indicate that the reading was not performed */
104 assert(result != NULL);
105 (*result) = SCIP_DIDNOTRUN;
106
107 return SCIP_OKAY;
108 }
109
110 /** problem writing method of reader; NOTE: if the parameter "genericnames" is TRUE, then
111 * SCIP already set all variable and constraint names to generic names; therefore, this
112 * method should always use SCIPvarGetName() and SCIPconsGetName();
113 *
114 * @see SCIP_DECL_READERWRITE(x) in @ref type_reader.h
115 */
116 virtual SCIP_DECL_READERWRITE(scip_write)
117 { /*lint --e{715}*/
118
119 /* set result pointer to indicate that the writing was not performed */
120 assert(result != NULL);
121 (*result) = SCIP_DIDNOTRUN;
122
123 return SCIP_OKAY;
124 }
125 };
126
127 } /* namespace scip */
128
129
130
131 /** creates the file reader for the given file reader object and includes it in SCIP
132 *
133 * The method should be called in one of the following ways:
134 *
135 * 1. The user is resposible of deleting the object:
136 * SCIP_CALL( SCIPcreate(&scip) );
137 * ...
138 * MyReader* myreader = new MyReader(...);
139 * SCIP_CALL( SCIPincludeObjReader(scip, &myreader, FALSE) );
140 * ...
141 * SCIP_CALL( SCIPfree(&scip) );
142 * delete myreader; // delete reader AFTER SCIPfree() !
143 *
144 * 2. The object pointer is passed to SCIP and deleted by SCIP in the SCIPfree() call:
145 * SCIP_CALL( SCIPcreate(&scip) );
146 * ...
147 * SCIP_CALL( SCIPincludeObjReader(scip, new MyReader(...), TRUE) );
148 * ...
149 * SCIP_CALL( SCIPfree(&scip) ); // destructor of MyReader is called here
150 */
151 SCIP_EXPORT
152 SCIP_RETCODE SCIPincludeObjReader(
153 SCIP* scip, /**< SCIP data structure */
154 scip::ObjReader* objreader, /**< file reader object */
155 SCIP_Bool deleteobject /**< should the reader object be deleted when reader is freed? */
156 );
157
158 /** returns the reader object of the given name, or 0 if not existing */
159 SCIP_EXPORT
160 scip::ObjReader* SCIPfindObjReader(
161 SCIP* scip, /**< SCIP data structure */
162 const char* name /**< name of file reader */
163 );
164
165 /** returns the reader object for the given file reader */
166 SCIP_EXPORT
167 scip::ObjReader* SCIPgetObjReader(
168 SCIP* scip, /**< SCIP data structure */
169 SCIP_READER* reader /**< file reader */
170 );
171
172 #endif
173