mirror of
https://github.com/scylladb/scylladb.git
synced 2026-04-19 16:15:07 +00:00
Instead of lengthy blurbs, switch to single-line, machine-readable standardized (https://spdx.dev) license identifiers. The Linux kernel switched long ago, so there is strong precedent. Three cases are handled: AGPL-only, Apache-only, and dual licensed. For the latter case, I chose (AGPL-3.0-or-later and Apache-2.0), reasoning that our changes are extensive enough to apply our license. The changes we applied mechanically with a script, except to licenses/README.md. Closes #9937
61 lines
2.6 KiB
C++
61 lines
2.6 KiB
C++
/*
|
|
* Copyright (C) 2015-present ScyllaDB
|
|
*/
|
|
|
|
/*
|
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "atomic_cell.hh"
|
|
#include "collection_mutation.hh"
|
|
#include "schema.hh"
|
|
|
|
// A variant type that can hold either an atomic_cell, or a serialized collection.
|
|
// Which type is stored is determined by the schema.
|
|
// Has an "empty" state.
|
|
// Objects moved-from are left in an empty state.
|
|
class atomic_cell_or_collection final {
|
|
managed_bytes _data;
|
|
private:
|
|
atomic_cell_or_collection(managed_bytes&& data) : _data(std::move(data)) {}
|
|
public:
|
|
atomic_cell_or_collection() = default;
|
|
atomic_cell_or_collection(atomic_cell_or_collection&&) = default;
|
|
atomic_cell_or_collection(const atomic_cell_or_collection&) = delete;
|
|
atomic_cell_or_collection& operator=(atomic_cell_or_collection&&) = default;
|
|
atomic_cell_or_collection& operator=(const atomic_cell_or_collection&) = delete;
|
|
atomic_cell_or_collection(atomic_cell ac) : _data(std::move(ac._data)) {}
|
|
atomic_cell_or_collection(const abstract_type& at, atomic_cell_view acv);
|
|
static atomic_cell_or_collection from_atomic_cell(atomic_cell data) { return { std::move(data._data) }; }
|
|
atomic_cell_view as_atomic_cell(const column_definition& cdef) const { return atomic_cell_view::from_bytes(*cdef.type, _data); }
|
|
atomic_cell_mutable_view as_mutable_atomic_cell(const column_definition& cdef) { return atomic_cell_mutable_view::from_bytes(*cdef.type, _data); }
|
|
atomic_cell_or_collection(collection_mutation cm) : _data(std::move(cm._data)) { }
|
|
atomic_cell_or_collection copy(const abstract_type&) const;
|
|
explicit operator bool() const {
|
|
return !_data.empty();
|
|
}
|
|
static constexpr bool can_use_mutable_view() {
|
|
return true;
|
|
}
|
|
static atomic_cell_or_collection from_collection_mutation(collection_mutation data) { return std::move(data._data); }
|
|
collection_mutation_view as_collection_mutation() const;
|
|
bytes_view serialize() const;
|
|
bool equals(const abstract_type& type, const atomic_cell_or_collection& other) const;
|
|
size_t external_memory_usage(const abstract_type&) const;
|
|
|
|
class printer {
|
|
const column_definition& _cdef;
|
|
const atomic_cell_or_collection& _cell;
|
|
public:
|
|
printer(const column_definition& cdef, const atomic_cell_or_collection& cell)
|
|
: _cdef(cdef), _cell(cell) { }
|
|
printer(const printer&) = delete;
|
|
printer(printer&&) = delete;
|
|
|
|
friend std::ostream& operator<<(std::ostream&, const printer&);
|
|
};
|
|
friend std::ostream& operator<<(std::ostream&, const printer&);
|
|
};
|