blob: 54c12363bff9385cf04e1e1458d4df7aab5d6226 [file] [log] [blame]
/*
* Copyright 2020 The casbin Authors. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "casbin/model/policy_collection.hpp"
PoliciesValues::PoliciesValues(PoliciesVector&& base_collection)
: opt_base_vector(base_collection), opt_base_hashset({}) {}
PoliciesValues::PoliciesValues(PoliciesHashset&& base_collection)
: opt_base_vector({}), opt_base_hashset(base_collection) {}
PoliciesValues::PoliciesValues(const std::initializer_list<PolicyValues>& list)
: opt_base_vector(list), opt_base_hashset({}) {}
PoliciesValues::PoliciesValues(size_t capacity)
: opt_base_vector(PoliciesVector()), opt_base_hashset({}) {
opt_base_vector->reserve(capacity);
}
PoliciesValues PoliciesValues::createWithVector(const std::initializer_list<PolicyValues>& list) {
PoliciesVector vec(list);
return PoliciesValues(std::move(vec));
}
PoliciesValues PoliciesValues::createWithHashset(const std::initializer_list<PolicyValues>& list) {
PoliciesHashset hashset(list);
return PoliciesValues(std::move(hashset));
}
size_t PoliciesValues::size() const {
if (opt_base_vector.has_value())
return opt_base_vector->size();
return opt_base_hashset->size();
}
bool PoliciesValues::empty() const {
if(opt_base_vector.has_value())
return opt_base_vector->empty();
return opt_base_hashset->empty();
}
bool PoliciesValues::is_hash() const {
return opt_base_hashset.has_value();
}
void PoliciesValues::emplace(const PolicyValues& element) {
if (opt_base_vector.has_value())
opt_base_vector->push_back(element);
else
opt_base_hashset->emplace(element);
}
PoliciesValues::iterator::iterator(const PoliciesVector::iterator& base_iterator_)
: opt_vector_iterator(base_iterator_), is_vector_iterator(true) {}
PoliciesValues::iterator::iterator(const PoliciesHashset::iterator& base_iterator_)
: opt_hashset_iterator(base_iterator_), is_vector_iterator(false) {}
PolicyValues& PoliciesValues::iterator::operator*() const {
if ( is_vector_iterator )
return *opt_vector_iterator;
return const_cast<PolicyValues&>(*opt_hashset_iterator);
}
PoliciesValues::iterator PoliciesValues::iterator::operator++() {
if ( is_vector_iterator )
opt_vector_iterator++;
else
opt_hashset_iterator++;
return *this;
}
bool PoliciesValues::iterator::operator!=(const PoliciesValues::iterator& other) const {
return opt_vector_iterator != other.opt_vector_iterator || opt_hashset_iterator != other.opt_hashset_iterator;
}
PoliciesValues::iterator PoliciesValues::begin() {
if (opt_base_vector.has_value())
return iterator(opt_base_vector->begin());
return iterator(opt_base_hashset->begin());
}
PoliciesValues::iterator PoliciesValues::end() {
if (opt_base_vector.has_value())
return iterator(opt_base_vector->end());
return iterator(opt_base_hashset->end());
}
PoliciesValues::iterator PoliciesValues::find(const PolicyValues& values) {
if (opt_base_vector.has_value())
return iterator(std::find(opt_base_vector->begin(), opt_base_vector->end(), values));
return iterator(opt_base_hashset->find(values));
}
void PoliciesValues::clear() {
if (opt_base_vector.has_value())
opt_base_vector->clear();
else
opt_base_hashset->clear();
}
void PoliciesValues::erase(const iterator& it) {
if (opt_base_vector.has_value())
opt_base_vector->erase(it.opt_vector_iterator);
else
opt_base_hashset->erase(it.opt_hashset_iterator);
}
PoliciesValues::const_iterator::const_iterator(const PoliciesVector::const_iterator& base_iterator_)
: opt_vector_iterator(base_iterator_), is_vector_iterator(true) {
}
PoliciesValues::const_iterator::const_iterator(const PoliciesHashset::const_iterator& base_iterator_)
: opt_hashset_iterator(base_iterator_), is_vector_iterator(false) {
}
const PolicyValues& PoliciesValues::const_iterator::operator*() const {
if ( is_vector_iterator )
return *opt_vector_iterator;
return *opt_hashset_iterator;
}
PoliciesValues::const_iterator PoliciesValues::const_iterator::operator++() {
if ( is_vector_iterator )
opt_vector_iterator++;
else
opt_hashset_iterator++;
return *this;
}
bool PoliciesValues::const_iterator::operator!=(const const_iterator& other) const {
return opt_vector_iterator != other.opt_vector_iterator || opt_hashset_iterator != other.opt_hashset_iterator;
}
PoliciesValues::const_iterator PoliciesValues::begin() const {
if (opt_base_vector.has_value())
return const_iterator(opt_base_vector->cbegin());
return const_iterator(opt_base_hashset->cbegin());
}
PoliciesValues::const_iterator PoliciesValues::end() const {
if (opt_base_vector.has_value())
return const_iterator(opt_base_vector->cend());
return const_iterator(opt_base_hashset->cend());
}