1
0
This repository has been archived on 2025-03-06. You can view files and clone it, but cannot push or open issues or pull requests.
Jip J. Dekker f2a1c4e389 Squashed 'software/mza/' content from commit f970a59b17
git-subtree-dir: software/mza
git-subtree-split: f970a59b177c13ca3dd8aaef8cc6681d83b7e813
2021-07-11 16:34:30 +10:00

50 lines
1.4 KiB
C++

/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
/*
* Main authors:
* Jip J. Dekker <jip.dekker@monash.edu>
* Guido Tack <guido.tack@monash.edu>
*/
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#pragma once
namespace MiniZinc {
class Interpreter;
class RefCountedObject {
public:
enum RCOType { VEC, VAR };
protected:
unsigned int _model_ref_count;
unsigned int _memory_ref_count : 31;
unsigned int _rco_type : 1;
int _timestamp;
RefCountedObject(const RCOType& t, int timestamp)
: _model_ref_count(0),
_memory_ref_count(0),
_rco_type(t == VEC ? 1 : 0),
_timestamp(timestamp) {}
public:
RCOType rcoType(void) const { return _rco_type == 1 ? VEC : VAR; }
const int timestamp() const { return _timestamp; }
bool exists() const { return _model_ref_count > 0; }
bool alive() const { return _model_ref_count + _memory_ref_count > 0; }
bool unique() const { return _model_ref_count == 1; }
void addRef(Interpreter* interpreter) { _model_ref_count++; }
void addMemRef(Interpreter* interpreter) { _memory_ref_count++; }
static void rmRef(Interpreter* interpreter, RefCountedObject* rco);
static void rmMemRef(Interpreter* interpreter, RefCountedObject* rco);
};
} // namespace MiniZinc