#ifndef __SCIP_OBJPROP_H__
#define __SCIP_OBJPROP_H__
#include <cstring>
#include <utility>
#include "scip/scip.h"
#include "objscip/objcloneable.h"
namespace scip
{
class ObjProp : public ObjCloneable
{
public:
SCIP* scip_;
char* scip_name_;
char* scip_desc_;
const int scip_priority_;
const int scip_freq_;
const SCIP_Bool scip_delay_;
const SCIP_PROPTIMING scip_timingmask_;
const int scip_presol_priority_;
const int scip_presol_maxrounds_;
const SCIP_PRESOLTIMING scip_presol_timing_;
ObjProp(
SCIP* scip,
const char* name,
const char* desc,
int priority,
int freq,
SCIP_Bool delay,
SCIP_PROPTIMING timingmask,
int presolpriority,
int presolmaxrounds,
SCIP_PRESOLTIMING presoltiming
)
: scip_(scip),
scip_name_(0),
scip_desc_(0),
scip_priority_(priority),
scip_freq_(freq),
scip_delay_(delay),
scip_timingmask_(timingmask),
scip_presol_priority_(presolpriority),
scip_presol_maxrounds_(presolmaxrounds),
scip_presol_timing_(presoltiming)
{
SCIP_CALL_ABORT( SCIPduplicateMemoryArray(scip_, &scip_name_, name, std::strlen(name)+1) );
SCIP_CALL_ABORT( SCIPduplicateMemoryArray(scip_, &scip_desc_, desc, std::strlen(desc)+1) );
}
ObjProp(const ObjProp& o)
: ObjProp(o.scip_, o.scip_name_, o.scip_desc_, o.scip_priority_, o.scip_freq_, o.scip_delay_, o.scip_timingmask_,
o.scip_presol_priority_, o.scip_presol_maxrounds_, o.scip_presol_timing_)
{
}
ObjProp(ObjProp&& o)
: scip_(o.scip_),
scip_name_(0),
scip_desc_(0),
scip_priority_(o.scip_priority_),
scip_freq_(o.scip_freq_),
scip_delay_(o.scip_delay_),
scip_timingmask_(o.scip_timingmask_),
scip_presol_priority_(o.scip_presol_priority_),
scip_presol_maxrounds_(o.scip_presol_maxrounds_),
scip_presol_timing_(o.scip_presol_timing_)
{
std::swap(scip_name_, o.scip_name_);
std::swap(scip_desc_, o.scip_desc_);
}
virtual ~ObjProp()
{
SCIPfreeMemoryArray(scip_, &scip_name_);
SCIPfreeMemoryArray(scip_, &scip_desc_);
}
ObjProp& operator=(const ObjProp& o) = delete;
ObjProp& operator=(ObjProp&& o) = delete;
virtual SCIP_DECL_PROPFREE(scip_free)
{
return SCIP_OKAY;
}
virtual SCIP_DECL_PROPINIT(scip_init)
{
return SCIP_OKAY;
}
virtual SCIP_DECL_PROPEXIT(scip_exit)
{
return SCIP_OKAY;
}
virtual SCIP_DECL_PROPINITPRE(scip_initpre)
{
return SCIP_OKAY;
}
virtual SCIP_DECL_PROPEXITPRE(scip_exitpre)
{
return SCIP_OKAY;
}
virtual SCIP_DECL_PROPINITSOL(scip_initsol)
{
return SCIP_OKAY;
}
virtual SCIP_DECL_PROPEXITSOL(scip_exitsol)
{
return SCIP_OKAY;
}
virtual SCIP_DECL_PROPPRESOL(scip_presol)
{
assert(result != NULL);
*result = SCIP_DIDNOTRUN;
return SCIP_OKAY;
}
virtual SCIP_DECL_PROPEXEC(scip_exec) = 0;
virtual SCIP_DECL_PROPRESPROP(scip_resprop)
{
assert(result != NULL);
(*result) = SCIP_DIDNOTFIND;
return SCIP_OKAY;
}
};
}
SCIP_EXPORT
SCIP_RETCODE SCIPincludeObjProp(
SCIP* scip,
scip::ObjProp* objprop,
SCIP_Bool deleteobject
);
SCIP_EXPORT
scip::ObjProp* SCIPfindObjProp(
SCIP* scip,
const char* name
);
SCIP_EXPORT
scip::ObjProp* SCIPgetObjProp(
SCIP* scip,
SCIP_PROP* prop
);
#endif