All Downloads are FREE. Search and download functionalities are using the official Maven repository.

z3-z3-4.13.0.src.util.scoped_numeral_vector.h Maven / Gradle / Ivy

The newest version!
/*++
Copyright (c) 2011 Microsoft Corporation

Module Name:

    scoped_numeral_vector.h

Abstract:

    Wrapper for easying the pain when using vectors of numerals.

Author:

    Leonardo de Moura (leonardo) 2011-12-03

Revision History:

--*/
#pragma once

#include "util/vector.h"

template
class _scoped_numeral_vector : public svector {
    Manager & m_manager;
public:
    _scoped_numeral_vector(Manager & m):m_manager(m) {}

    _scoped_numeral_vector(const _scoped_numeral_vector & other) : m_manager(other.m_manager) {
        for (unsigned i = 0, e = other.size(); i != e; ++i) {
            push_back((*this)[i]);
        }
    }

    _scoped_numeral_vector(_scoped_numeral_vector&&) = default;

    ~_scoped_numeral_vector() {
        reset();
    }

    void reset() {
        auto sz = this->size();
        for (unsigned i = 0; i < sz; i++) {
            m().del(this->operator[](i));
        }
        svector::reset();
    }

    Manager & m() const { return m_manager; }

    void push_back(typename Manager::numeral const & v) {
        svector::push_back(typename Manager::numeral());
        m_manager.set(this->back(), v);
    }

    void pop_back() {
        shrink(this->size()-1);
    }

    void shrink(unsigned sz) {
        unsigned old_sz = this->size();
        if (old_sz == sz)
            return;
        for (unsigned i = sz; i < old_sz; i++)
            m().del(this->operator[](i));
        svector::shrink(sz);
    }

    void resize(unsigned sz) {
        unsigned old_sz = this->size();
        if (sz <= old_sz)
            shrink(sz);
        svector::resize(sz, 0);
    }
};




© 2015 - 2024 Weber Informatics LLC | Privacy Policy