/** * Copyright 2019-2020 Huawei Technologies Co., Ltd * * 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 "utils/base_ref.h" namespace mindspore { iterator ConstIteratorCast(std::vector *v, const const_iterator iter) { return std::next(v->begin(), std::distance(v->cbegin(), iter)); } BaseRef::BaseRef(const BaseRef &other) : Base(other), m_ptr(other.m_ptr) { if (!m_ptr) { m_ptr = other.copy(); } } bool BaseRef::operator==(const BaseRef &other) const { if (m_ptr == other.m_ptr) { return true; } if (m_ptr == nullptr && other.m_ptr == nullptr) { return *this == other; } if (m_ptr == nullptr || other.m_ptr == nullptr) { return false; } if (type() != other.type()) { MS_LOG(DEBUG) << "Type mismatch"; return false; } if (m_ptr->isa()) { return *(m_ptr->cast()) == *(other.m_ptr->cast()); } // for noderef equal if (m_ptr->isa()) { return *std::static_pointer_cast(m_ptr) == *std::static_pointer_cast(other.m_ptr); } // for node equal return *m_ptr == *other.m_ptr; } // left reference BaseRef &BaseRef::operator=(const BaseRef &other) { if ((m_ptr != nullptr && m_ptr == other.m_ptr) || this == &other) { return *this; } m_ptr = other.copy(); return *this; } // right reference BaseRef &BaseRef::operator=(BaseRef &&other) { if ((m_ptr != nullptr && m_ptr == other.m_ptr) || this == &other) { return *this; } m_ptr = other.copy(); other.m_ptr = nullptr; return *this; } std::string BaseRef::ToString() const { if (m_ptr != nullptr) { return std::string(m_ptr->type_name()) + std::string(" value:") + m_ptr->ToString(); } return std::string(); } uint32_t BaseRef::type() const { if (m_ptr != nullptr) { return m_ptr->tid(); } return tid(); } // left reference SetRef &SetRef::operator=(const SetRef &other) { if (elements_ == other.elements_ || this == &other) { return *this; } elements_ = other.elements_; return *this; } std::string SetRef::ToString() const { std::ostringstream buffer; bool begin = true; buffer << "set["; for (auto &attr : elements_) { if (!begin) { buffer << ", "; } else { begin = false; } buffer << attr.ToString(); } buffer << "]"; return buffer.str(); } // left reference VectorRef &VectorRef::operator=(const VectorRef &other) { if (elements_ == other.elements_ || this == &other) { return *this; } elements_ = other.elements_; return *this; } std::string VectorRef::ToString() const { std::ostringstream buffer; bool begin = true; buffer << "vector["; for (auto &attr : elements_) { if (!begin) { buffer << ", "; } else { begin = false; } buffer << attr.ToString(); } buffer << "]"; return buffer.str(); } bool VectorRef::operator==(const BaseRef &other) const { if (!utils::isa(other)) { return false; } return *this == utils::cast(other); } bool VectorRef::operator==(const VectorRef &other) const { if (elements_.size() != other.elements_.size()) { return false; } for (size_t i = 0; i < elements_.size(); ++i) { if (elements_[i] != other.elements_[i]) { return false; } } return true; } bool SetRef::operator==(const BaseRef &other) const { if (!utils::isa(other)) { return false; } return *this == utils::cast(other); } bool SetRef::operator==(const SetRef &other) const { if (elements_.size() != other.elements_.size()) { return false; } auto iter = elements_.begin(); auto oth_iter = other.elements_.begin(); for (; iter != elements_.end(); iter++, oth_iter++) { if (*iter != *oth_iter) { return false; } } return true; } bool RunFunctionRef::operator==(const BaseRef &other) const { if (!utils::isa(other)) { return false; } return *this == utils::cast(other); } bool RunFunctionRef::operator==(const RunFunctionRef &other) const { return func_ == other.func_; } } // namespace mindspore