mirror of
https://github.com/Z3Prover/z3
synced 2025-06-20 12:53:38 +00:00
remove a bunch of constructors to avoid copies
still not enough to guarantee that vector::expand doesnt copy (WIP)
This commit is contained in:
parent
98b5abb1d4
commit
7ac2791482
16 changed files with 66 additions and 83 deletions
|
@ -1,6 +1,5 @@
|
||||||
|
|
||||||
#ifndef JUSTIFIED_EXPR_H_
|
#pragma once
|
||||||
#define JUSTIFIED_EXPR_H_
|
|
||||||
|
|
||||||
#include "ast/ast.h"
|
#include "ast/ast.h"
|
||||||
|
|
||||||
|
@ -40,6 +39,15 @@ public:
|
||||||
m.inc_ref(m_proof);
|
m.inc_ref(m_proof);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
justified_expr(justified_expr && other):
|
||||||
|
m(other.m),
|
||||||
|
m_fml(nullptr),
|
||||||
|
m_proof(nullptr)
|
||||||
|
{
|
||||||
|
std::swap(m_fml, other.m_fml);
|
||||||
|
std::swap(m_proof, other.m_proof);
|
||||||
|
}
|
||||||
|
|
||||||
~justified_expr() {
|
~justified_expr() {
|
||||||
m.dec_ref(m_fml);
|
m.dec_ref(m_fml);
|
||||||
m.dec_ref(m_proof);
|
m.dec_ref(m_proof);
|
||||||
|
@ -50,5 +58,3 @@ public:
|
||||||
expr* get_fml() const { return m_fml; }
|
expr* get_fml() const { return m_fml; }
|
||||||
proof* get_proof() const { return m_proof; }
|
proof* get_proof() const { return m_proof; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -221,16 +221,6 @@ struct nnf::imp {
|
||||||
m_cache_result(cache_res),
|
m_cache_result(cache_res),
|
||||||
m_spos(spos) {
|
m_spos(spos) {
|
||||||
}
|
}
|
||||||
frame(frame && other):
|
|
||||||
m_curr(std::move(other.m_curr)),
|
|
||||||
m_i(other.m_i),
|
|
||||||
m_pol(other.m_pol),
|
|
||||||
m_in_q(other.m_in_q),
|
|
||||||
m_new_child(other.m_new_child),
|
|
||||||
m_cache_result(other.m_cache_result),
|
|
||||||
m_spos(other.m_spos) {
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// There are four caches:
|
// There are four caches:
|
||||||
|
|
|
@ -54,6 +54,10 @@ public:
|
||||||
if (m_t) m.inc_ref(m_t);
|
if (m_t) m.inc_ref(m_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
move(move &&other) noexcept : m(other.m), m_t(nullptr), m_src(other.m_src), m_dst(other.m_dst) {
|
||||||
|
std::swap(m_t, other.m_t);
|
||||||
|
}
|
||||||
|
|
||||||
move& operator=(move const& other) {
|
move& operator=(move const& other) {
|
||||||
SASSERT(&m == &other.m);
|
SASSERT(&m == &other.m);
|
||||||
T* t = other.m_t;
|
T* t = other.m_t;
|
||||||
|
|
|
@ -208,7 +208,7 @@ namespace sat {
|
||||||
}
|
}
|
||||||
|
|
||||||
void model_converter::add_elim_stack(entry & e) {
|
void model_converter::add_elim_stack(entry & e) {
|
||||||
e.m_elim_stack.push_back(stackv().empty() ? nullptr : alloc(elim_stack, stackv()));
|
e.m_elim_stack.push_back(stackv().empty() ? nullptr : alloc(elim_stack, std::move(m_elim_stack)));
|
||||||
// VERIFY(for (auto const& s : stackv()) VERIFY(legal_to_flip(s.second.var())););
|
// VERIFY(for (auto const& s : stackv()) VERIFY(legal_to_flip(s.second.var())););
|
||||||
stackv().reset();
|
stackv().reset();
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,8 +16,7 @@ Author:
|
||||||
Revision History:
|
Revision History:
|
||||||
|
|
||||||
--*/
|
--*/
|
||||||
#ifndef SAT_MODEL_CONVERTER_H_
|
#pragma once
|
||||||
#define SAT_MODEL_CONVERTER_H_
|
|
||||||
|
|
||||||
#include "sat/sat_types.h"
|
#include "sat/sat_types.h"
|
||||||
#include "util/ref_vector.h"
|
#include "util/ref_vector.h"
|
||||||
|
@ -51,12 +50,12 @@ namespace sat {
|
||||||
unsigned m_counter;
|
unsigned m_counter;
|
||||||
unsigned m_refcount;
|
unsigned m_refcount;
|
||||||
elim_stackv m_stack;
|
elim_stackv m_stack;
|
||||||
elim_stack(elim_stack const& );
|
|
||||||
public:
|
public:
|
||||||
elim_stack(elim_stackv const& stack):
|
elim_stack(elim_stack const&) = delete;
|
||||||
|
elim_stack(elim_stackv && stack):
|
||||||
m_counter(0),
|
m_counter(0),
|
||||||
m_refcount(0),
|
m_refcount(0),
|
||||||
m_stack(stack) {
|
m_stack(std::move(stack)) {
|
||||||
m_counter = ++counter;
|
m_counter = ++counter;
|
||||||
}
|
}
|
||||||
~elim_stack() { }
|
~elim_stack() { }
|
||||||
|
@ -76,14 +75,6 @@ namespace sat {
|
||||||
sref_vector<elim_stack> m_elim_stack;
|
sref_vector<elim_stack> m_elim_stack;
|
||||||
entry(kind k, bool_var v): m_var(v), m_kind(k) {}
|
entry(kind k, bool_var v): m_var(v), m_kind(k) {}
|
||||||
public:
|
public:
|
||||||
entry(entry const & src):
|
|
||||||
m_var(src.m_var),
|
|
||||||
m_kind(src.m_kind),
|
|
||||||
m_clauses(src.m_clauses),
|
|
||||||
m_clause(src.m_clause)
|
|
||||||
{
|
|
||||||
m_elim_stack.append(src.m_elim_stack);
|
|
||||||
}
|
|
||||||
bool_var var() const { return m_var; }
|
bool_var var() const { return m_var; }
|
||||||
kind get_kind() const { return m_kind; }
|
kind get_kind() const { return m_kind; }
|
||||||
};
|
};
|
||||||
|
@ -166,5 +157,3 @@ namespace sat {
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -228,7 +228,7 @@ interval::interval(v_dependency_manager & m, rational const & val, bool open, bo
|
||||||
}
|
}
|
||||||
|
|
||||||
interval & interval::operator=(interval const & other) {
|
interval & interval::operator=(interval const & other) {
|
||||||
SASSERT(&m == &other.m);
|
SASSERT(&m_manager == &other.m_manager);
|
||||||
m_lower = other.m_lower;
|
m_lower = other.m_lower;
|
||||||
m_upper = other.m_upper;
|
m_upper = other.m_upper;
|
||||||
m_lower_open = other.m_lower_open;
|
m_lower_open = other.m_lower_open;
|
||||||
|
@ -239,7 +239,7 @@ interval & interval::operator=(interval const & other) {
|
||||||
}
|
}
|
||||||
|
|
||||||
interval & interval::operator=(interval && other) {
|
interval & interval::operator=(interval && other) {
|
||||||
SASSERT(&m == &other.m);
|
SASSERT(&m_manager == &other.m_manager);
|
||||||
m_lower = std::move(other.m_lower);
|
m_lower = std::move(other.m_lower);
|
||||||
m_upper = std::move(other.m_upper);
|
m_upper = std::move(other.m_upper);
|
||||||
m_lower_open = other.m_lower_open;
|
m_lower_open = other.m_lower_open;
|
||||||
|
|
|
@ -39,7 +39,7 @@ protected:
|
||||||
}
|
}
|
||||||
|
|
||||||
void expand() {
|
void expand() {
|
||||||
static_assert(std::is_nothrow_move_constructible<T>::value);
|
static_assert(std::is_nothrow_move_constructible<T>::value, "");
|
||||||
unsigned new_capacity = m_capacity << 1;
|
unsigned new_capacity = m_capacity << 1;
|
||||||
T * new_buffer = reinterpret_cast<T*>(memory::allocate(sizeof(T) * new_capacity));
|
T * new_buffer = reinterpret_cast<T*>(memory::allocate(sizeof(T) * new_capacity));
|
||||||
for (unsigned i = 0; i < m_pos; ++i) {
|
for (unsigned i = 0; i < m_pos; ++i) {
|
||||||
|
|
|
@ -16,8 +16,8 @@ Author:
|
||||||
Revision History:
|
Revision History:
|
||||||
|
|
||||||
--*/
|
--*/
|
||||||
#ifndef HASHTABLE_H_
|
#pragma once
|
||||||
#define HASHTABLE_H_
|
|
||||||
#include "util/debug.h"
|
#include "util/debug.h"
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
#include "util/util.h"
|
#include "util/util.h"
|
||||||
|
@ -269,6 +269,19 @@ public:
|
||||||
m_st_collision = 0;
|
m_st_collision = 0;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
core_hashtable(core_hashtable && source) noexcept :
|
||||||
|
HashProc(source),
|
||||||
|
EqProc(source),
|
||||||
|
m_table(nullptr) {
|
||||||
|
m_capacity = source.m_capacity;
|
||||||
|
std::swap(m_table, source.m_table);
|
||||||
|
m_size = source.m_size;
|
||||||
|
m_num_deleted = 0;
|
||||||
|
HS_CODE({
|
||||||
|
m_st_collision = 0;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
~core_hashtable() {
|
~core_hashtable() {
|
||||||
delete_table();
|
delete_table();
|
||||||
|
@ -736,6 +749,3 @@ public:
|
||||||
EqProc const & e = EqProc()):
|
EqProc const & e = EqProc()):
|
||||||
core_hashtable<int_hash_entry<INT_MIN, INT_MIN + 1>, HashProc, EqProc>(initial_capacity, h, e) {}
|
core_hashtable<int_hash_entry<INT_MIN, INT_MIN + 1>, HashProc, EqProc>(initial_capacity, h, e) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif /* HASHTABLE_H_ */
|
|
||||||
|
|
|
@ -36,9 +36,6 @@ class hwf {
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
hwf() {}
|
|
||||||
hwf(hwf const & other) { this->value = other.value; }
|
|
||||||
~hwf() {}
|
|
||||||
void swap(hwf & other) { double t = value; value = other.value; other.value = t; }
|
void swap(hwf & other) { double t = value; value = other.value; other.value = t; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,7 @@ Author:
|
||||||
Revision History:
|
Revision History:
|
||||||
|
|
||||||
--*/
|
--*/
|
||||||
#ifndef MPF_H_
|
#pragma once
|
||||||
#define MPF_H_
|
|
||||||
|
|
||||||
#include<string>
|
#include<string>
|
||||||
#include "util/mpz.h"
|
#include "util/mpz.h"
|
||||||
|
@ -45,18 +44,13 @@ class mpf {
|
||||||
unsigned sign:1; // counts as one sbit.
|
unsigned sign:1; // counts as one sbit.
|
||||||
mpz significand;
|
mpz significand;
|
||||||
mpf_exp_t exponent;
|
mpf_exp_t exponent;
|
||||||
mpf & operator=(mpf const & other) { UNREACHABLE(); return *this; }
|
|
||||||
void set(unsigned _ebits, unsigned _sbits);
|
void set(unsigned _ebits, unsigned _sbits);
|
||||||
public:
|
public:
|
||||||
mpf();
|
mpf();
|
||||||
mpf(unsigned ebits, unsigned sbits);
|
mpf(unsigned ebits, unsigned sbits);
|
||||||
mpf(mpf && other) :
|
mpf(mpf &&) = default;
|
||||||
ebits(other.ebits),
|
|
||||||
sbits(other.sbits),
|
|
||||||
sign(other.sign),
|
|
||||||
significand(std::move(other.significand)),
|
|
||||||
exponent(other.exponent) {}
|
|
||||||
~mpf();
|
~mpf();
|
||||||
|
mpf & operator=(mpf const & other) = delete;
|
||||||
unsigned get_ebits() const { return ebits; }
|
unsigned get_ebits() const { return ebits; }
|
||||||
unsigned get_sbits() const { return sbits; }
|
unsigned get_sbits() const { return sbits; }
|
||||||
void swap(mpf & other);
|
void swap(mpf & other);
|
||||||
|
@ -325,5 +319,3 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef _scoped_numeral_vector<mpf_manager> scoped_mpf_vector;
|
typedef _scoped_numeral_vector<mpf_manager> scoped_mpf_vector;
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -16,8 +16,7 @@ Author:
|
||||||
Revision History:
|
Revision History:
|
||||||
|
|
||||||
--*/
|
--*/
|
||||||
#ifndef MPQ_H_
|
#pragma once
|
||||||
#define MPQ_H_
|
|
||||||
|
|
||||||
#include "util/mpz.h"
|
#include "util/mpz.h"
|
||||||
#include "util/trace.h"
|
#include "util/trace.h"
|
||||||
|
@ -27,11 +26,11 @@ class mpq {
|
||||||
mpz m_den;
|
mpz m_den;
|
||||||
friend class mpq_manager<true>;
|
friend class mpq_manager<true>;
|
||||||
friend class mpq_manager<false>;
|
friend class mpq_manager<false>;
|
||||||
mpq & operator=(mpq const & other) { UNREACHABLE(); return *this; }
|
|
||||||
public:
|
public:
|
||||||
mpq(int v):m_num(v), m_den(1) {}
|
mpq(int v):m_num(v), m_den(1) {}
|
||||||
mpq():m_den(1) {}
|
mpq():m_den(1) {}
|
||||||
mpq(mpq && other) : m_num(std::move(other.m_num)), m_den(std::move(other.m_den)) {}
|
mpq(mpq &&) = default;
|
||||||
|
mpq & operator=(mpq const &) = delete;
|
||||||
void swap(mpq & other) { m_num.swap(other.m_num); m_den.swap(other.m_den); }
|
void swap(mpq & other) { m_num.swap(other.m_num); m_den.swap(other.m_den); }
|
||||||
mpz const & numerator() const { return m_num; }
|
mpz const & numerator() const { return m_num; }
|
||||||
mpz const & denominator() const { return m_den; }
|
mpz const & denominator() const { return m_den; }
|
||||||
|
@ -862,6 +861,3 @@ typedef mpq_manager<false> unsynch_mpq_manager;
|
||||||
typedef _scoped_numeral<unsynch_mpq_manager> scoped_mpq;
|
typedef _scoped_numeral<unsynch_mpq_manager> scoped_mpq;
|
||||||
typedef _scoped_numeral<synch_mpq_manager> scoped_synch_mpq;
|
typedef _scoped_numeral<synch_mpq_manager> scoped_synch_mpq;
|
||||||
typedef _scoped_numeral_vector<unsynch_mpq_manager> scoped_mpq_vector;
|
typedef _scoped_numeral_vector<unsynch_mpq_manager> scoped_mpq_vector;
|
||||||
|
|
||||||
#endif /* MPQ_H_ */
|
|
||||||
|
|
||||||
|
|
|
@ -105,8 +105,8 @@ public:
|
||||||
mpz(mpz_type* ptr): m_val(0), m_kind(mpz_small), m_owner(mpz_ext), m_ptr(ptr) { SASSERT(ptr);}
|
mpz(mpz_type* ptr): m_val(0), m_kind(mpz_small), m_owner(mpz_ext), m_ptr(ptr) { SASSERT(ptr);}
|
||||||
mpz(mpz && other) noexcept : m_val(other.m_val), m_kind(mpz_small), m_owner(mpz_self), m_ptr(nullptr) {
|
mpz(mpz && other) noexcept : m_val(other.m_val), m_kind(mpz_small), m_owner(mpz_self), m_ptr(nullptr) {
|
||||||
std::swap(m_ptr, other.m_ptr);
|
std::swap(m_ptr, other.m_ptr);
|
||||||
unsigned o = m_owner; m_owner = other.m_owner; other.m_owner = o;
|
m_owner = other.m_owner;
|
||||||
unsigned k = m_kind; m_kind = other.m_kind; other.m_kind = k;
|
m_kind = other.m_kind;
|
||||||
}
|
}
|
||||||
void swap(mpz & other) {
|
void swap(mpz & other) {
|
||||||
std::swap(m_val, other.m_val);
|
std::swap(m_val, other.m_val);
|
||||||
|
|
|
@ -18,8 +18,7 @@ Revision History:
|
||||||
|
|
||||||
--*/
|
--*/
|
||||||
|
|
||||||
#ifndef OPTIONAL_H_
|
#pragma once
|
||||||
#define OPTIONAL_H_
|
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
class optional {
|
class optional {
|
||||||
|
@ -47,6 +46,11 @@ public:
|
||||||
construct(val);
|
construct(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
optional(T && val) noexcept : m_obj(nullptr), m_initialized(0) {
|
||||||
|
std::swap(m_obj, val.m_obj);
|
||||||
|
std::swap(m_initialized, val.m_initialized);
|
||||||
|
}
|
||||||
|
|
||||||
optional(const optional<T> & val):
|
optional(const optional<T> & val):
|
||||||
m_initialized(0) {
|
m_initialized(0) {
|
||||||
if (val.m_initialized == 1) {
|
if (val.m_initialized == 1) {
|
||||||
|
@ -160,7 +164,3 @@ public:
|
||||||
|
|
||||||
T * & operator*() { return m_ptr; }
|
T * & operator*() { return m_ptr; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif /* OPTIONAL_H_ */
|
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@ public:
|
||||||
rational() {}
|
rational() {}
|
||||||
|
|
||||||
rational(rational const & r) { m().set(m_val, r.m_val); }
|
rational(rational const & r) { m().set(m_val, r.m_val); }
|
||||||
rational(rational && r) noexcept : m_val(std::move(r.m_val)) {}
|
rational(rational&&) = default;
|
||||||
|
|
||||||
explicit rational(int n) { m().set(m_val, n); }
|
explicit rational(int n) { m().set(m_val, n); }
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,7 @@ Author:
|
||||||
Revision History:
|
Revision History:
|
||||||
|
|
||||||
--*/
|
--*/
|
||||||
#ifndef REF_VECTOR_H_
|
#pragma once
|
||||||
#define REF_VECTOR_H_
|
|
||||||
|
|
||||||
#include "util/vector.h"
|
#include "util/vector.h"
|
||||||
#include "util/obj_ref.h"
|
#include "util/obj_ref.h"
|
||||||
|
@ -49,11 +48,14 @@ protected:
|
||||||
public:
|
public:
|
||||||
typedef T * data;
|
typedef T * data;
|
||||||
|
|
||||||
ref_vector_core(Ref const & r = Ref()):Ref(r) {}
|
ref_vector_core() = default;
|
||||||
|
ref_vector_core(Ref const & r) : Ref(r) {}
|
||||||
|
|
||||||
ref_vector_core(ref_vector_core && other) :
|
ref_vector_core(const ref_vector_core & other) {
|
||||||
Ref(std::move(other)),
|
append(other);
|
||||||
m_nodes(std::move(other.m_nodes)) {}
|
}
|
||||||
|
|
||||||
|
ref_vector_core(ref_vector_core &&) = default;
|
||||||
|
|
||||||
~ref_vector_core() {
|
~ref_vector_core() {
|
||||||
dec_range_ref(m_nodes.begin(), m_nodes.end());
|
dec_range_ref(m_nodes.begin(), m_nodes.end());
|
||||||
|
@ -400,9 +402,8 @@ public:
|
||||||
/**
|
/**
|
||||||
\brief Vector of unmanaged references.
|
\brief Vector of unmanaged references.
|
||||||
*/
|
*/
|
||||||
template<typename T>
|
template<typename T>
|
||||||
class sref_vector : public ref_vector_core<T, ref_unmanaged_wrapper<T> > {
|
using sref_vector = ref_vector_core<T, ref_unmanaged_wrapper<T>>;
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
\brief Hash utilities on ref_vector pointers.
|
\brief Hash utilities on ref_vector pointers.
|
||||||
|
@ -440,6 +441,3 @@ struct ref_vector_ptr_eq {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif /* REF_VECTOR_H_ */
|
|
||||||
|
|
|
@ -69,6 +69,7 @@ class vector {
|
||||||
m_data = reinterpret_cast<T *>(mem);
|
m_data = reinterpret_cast<T *>(mem);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
//static_assert(std::is_nothrow_move_constructible<T>::value, "");
|
||||||
SASSERT(capacity() > 0);
|
SASSERT(capacity() > 0);
|
||||||
SZ old_capacity = reinterpret_cast<SZ *>(m_data)[CAPACITY_IDX];
|
SZ old_capacity = reinterpret_cast<SZ *>(m_data)[CAPACITY_IDX];
|
||||||
SZ old_capacity_T = sizeof(T) * old_capacity + sizeof(SZ) * 2;
|
SZ old_capacity_T = sizeof(T) * old_capacity + sizeof(SZ) * 2;
|
||||||
|
@ -163,7 +164,7 @@ public:
|
||||||
SASSERT(size() == source.size());
|
SASSERT(size() == source.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
vector(vector&& other) : m_data(nullptr) {
|
vector(vector&& other) noexcept : m_data(nullptr) {
|
||||||
std::swap(m_data, other.m_data);
|
std::swap(m_data, other.m_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -587,7 +588,7 @@ public:
|
||||||
ptr_vector(unsigned s):vector<T *, false>(s) {}
|
ptr_vector(unsigned s):vector<T *, false>(s) {}
|
||||||
ptr_vector(unsigned s, T * elem):vector<T *, false>(s, elem) {}
|
ptr_vector(unsigned s, T * elem):vector<T *, false>(s, elem) {}
|
||||||
ptr_vector(ptr_vector const & source):vector<T *, false>(source) {}
|
ptr_vector(ptr_vector const & source):vector<T *, false>(source) {}
|
||||||
ptr_vector(ptr_vector && other) : vector<T*, false>(std::move(other)) {}
|
ptr_vector(ptr_vector && other) noexcept : vector<T*, false>(std::move(other)) {}
|
||||||
ptr_vector(unsigned s, T * const * data):vector<T *, false>(s, const_cast<T**>(data)) {}
|
ptr_vector(unsigned s, T * const * data):vector<T *, false>(s, const_cast<T**>(data)) {}
|
||||||
ptr_vector & operator=(ptr_vector const & source) {
|
ptr_vector & operator=(ptr_vector const & source) {
|
||||||
vector<T *, false>::operator=(source);
|
vector<T *, false>::operator=(source);
|
||||||
|
@ -602,7 +603,7 @@ public:
|
||||||
svector(SZ s):vector<T, false, SZ>(s) {}
|
svector(SZ s):vector<T, false, SZ>(s) {}
|
||||||
svector(SZ s, T const & elem):vector<T, false, SZ>(s, elem) {}
|
svector(SZ s, T const & elem):vector<T, false, SZ>(s, elem) {}
|
||||||
svector(svector const & source):vector<T, false, SZ>(source) {}
|
svector(svector const & source):vector<T, false, SZ>(source) {}
|
||||||
svector(svector && other) : vector<T, false, SZ>(std::move(other)) {}
|
svector(svector && other) noexcept : vector<T, false, SZ>(std::move(other)) {}
|
||||||
svector(SZ s, T const * data):vector<T, false, SZ>(s, data) {}
|
svector(SZ s, T const * data):vector<T, false, SZ>(s, data) {}
|
||||||
svector & operator=(svector const & source) {
|
svector & operator=(svector const & source) {
|
||||||
vector<T, false, SZ>::operator=(source);
|
vector<T, false, SZ>::operator=(source);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue