File indexing completed on 2024-05-19 05:42:12

0001 // ct_lvtmdb_typeobject.cpp
0002 
0003 /*
0004 // Copyright 2023 Codethink Ltd <codethink@codethink.co.uk>
0005 // SPDX-License-Identifier: Apache-2.0
0006 //
0007 // Licensed under the Apache License, Version 2.0 (the "License");
0008 // you may not use this file except in compliance with the License.
0009 // You may obtain a copy of the License at
0010 //
0011 //     http://www.apache.org/licenses/LICENSE-2.0
0012 //
0013 // Unless required by applicable law or agreed to in writing, software
0014 // distributed under the License is distributed on an "AS IS" BASIS,
0015 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
0016 // See the License for the specific language governing permissions and
0017 // limitations under the License.
0018 */
0019 
0020 #include "ct_lvtmdb_componentobject.h"
0021 #include <ct_lvtmdb_typeobject.h>
0022 
0023 #include <ct_lvtmdb_util.h>
0024 
0025 #include <cassert>
0026 
0027 namespace Codethink::lvtmdb {
0028 
0029 TypeObject::TypeObject(std::string qualifiedName,
0030                        std::string name,
0031                        lvtshr::UDTKind kind,
0032                        lvtshr::AccessSpecifier access,
0033                        NamespaceObject *nmspc,
0034                        PackageObject *package,
0035                        TypeObject *parent):
0036     DatabaseObject(std::move(qualifiedName), std::move(name)),
0037     d_kind(kind),
0038     d_access(access),
0039     d_namespace_p(nmspc),
0040     d_package_p(package),
0041     d_parent_p(parent)
0042 {
0043 }
0044 
0045 TypeObject::~TypeObject() noexcept = default;
0046 
0047 TypeObject::TypeObject(TypeObject&&) noexcept = default;
0048 
0049 TypeObject& TypeObject::operator=(TypeObject&&) noexcept = default;
0050 
0051 lvtshr::UDTKind TypeObject::kind() const
0052 {
0053     assertReadable();
0054     return d_kind;
0055 }
0056 
0057 lvtshr::AccessSpecifier TypeObject::access() const
0058 {
0059     assertReadable();
0060     return d_access;
0061 }
0062 
0063 NamespaceObject *TypeObject::parentNamespace() const
0064 {
0065     assertReadable();
0066     return d_namespace_p;
0067 }
0068 
0069 PackageObject *TypeObject::package() const
0070 {
0071     assertReadable();
0072     return d_package_p;
0073 }
0074 
0075 TypeObject *TypeObject::parent() const
0076 {
0077     assertReadable();
0078     return d_parent_p;
0079 }
0080 
0081 const std::vector<TypeObject *>& TypeObject::children() const
0082 {
0083     assertReadable();
0084     return d_children;
0085 }
0086 
0087 const std::vector<TypeObject *>& TypeObject::subclasses() const
0088 {
0089     assertReadable();
0090     return d_subclasses;
0091 }
0092 
0093 const std::vector<TypeObject *>& TypeObject::superclasses() const
0094 {
0095     assertReadable();
0096     return d_superclasses;
0097 }
0098 
0099 const std::vector<TypeObject *>& TypeObject::usesInTheInterface() const
0100 {
0101     assertReadable();
0102     return d_usesInTheInterface;
0103 }
0104 
0105 const std::vector<TypeObject *>& TypeObject::revUsesInTheInterface() const
0106 {
0107     assertReadable();
0108     return d_revUsesInTheInterface;
0109 }
0110 
0111 const std::vector<TypeObject *>& TypeObject::usesInTheImplementation() const
0112 {
0113     assertReadable();
0114     return d_usesInTheImplementation;
0115 }
0116 
0117 const std::vector<TypeObject *>& TypeObject::revUsesInTheImplementation() const
0118 {
0119     assertReadable();
0120     return d_revUsesInTheImplementation;
0121 }
0122 
0123 const std::vector<FileObject *>& TypeObject::files() const
0124 {
0125     assertReadable();
0126     return d_files;
0127 }
0128 
0129 const std::vector<ComponentObject *>& TypeObject::components() const
0130 {
0131     assertReadable();
0132     return d_components;
0133 }
0134 
0135 const std::vector<MethodObject *>& TypeObject::methods() const
0136 {
0137     assertReadable();
0138     return d_methods;
0139 }
0140 
0141 const std::vector<FieldObject *>& TypeObject::fields() const
0142 {
0143     assertReadable();
0144     return d_fields;
0145 }
0146 
0147 void TypeObject::setPackage(PackageObject *package)
0148 {
0149     assertWritable();
0150     d_package_p = package;
0151 }
0152 
0153 void TypeObject::addChild(TypeObject *child)
0154 {
0155     assertWritable();
0156     MdbUtil::pushBackUnique(d_children, child);
0157 }
0158 
0159 void TypeObject::addFile(FileObject *file)
0160 {
0161     assertWritable();
0162     MdbUtil::pushBackUnique(d_files, file);
0163 }
0164 
0165 void TypeObject::removeFile(FileObject *file)
0166 {
0167     assertWritable();
0168     d_files.erase(std::remove(d_files.begin(), d_files.end(), file), d_files.end());
0169 }
0170 
0171 void TypeObject::addComponent(ComponentObject *component)
0172 {
0173     assertWritable();
0174     MdbUtil::pushBackUnique(d_components, component);
0175 }
0176 
0177 void TypeObject::addMethod(MethodObject *method)
0178 {
0179     assertWritable();
0180     MdbUtil::pushBackUnique(d_methods, method);
0181 }
0182 
0183 void TypeObject::addField(FieldObject *field)
0184 {
0185     assertWritable();
0186     MdbUtil::pushBackUnique(d_fields, field);
0187 }
0188 
0189 void TypeObject::addIsARelationship(TypeObject *subclass, TypeObject *superclass)
0190 {
0191     assert(subclass);
0192     assert(superclass);
0193     addPeerRelationship(subclass, superclass, subclass->d_superclasses, superclass->d_subclasses);
0194 }
0195 
0196 void TypeObject::addUsesInTheInterface(TypeObject *source, TypeObject *target)
0197 {
0198     assert(source);
0199     assert(target);
0200     addPeerRelationship(source, target, source->d_usesInTheInterface, target->d_revUsesInTheInterface);
0201 }
0202 
0203 void TypeObject::addUsesInTheImplementation(TypeObject *source, TypeObject *target)
0204 {
0205     assert(source);
0206     assert(target);
0207     addPeerRelationship(source, target, source->d_usesInTheImplementation, target->d_revUsesInTheImplementation);
0208 }
0209 
0210 void TypeObject::setUniqueFile(FileObject *file)
0211 {
0212     assertWritable();
0213     d_files.clear();
0214     d_files.push_back(file);
0215 }
0216 
0217 void TypeObject::setUniqueComponent(ComponentObject *comp)
0218 {
0219     assertWritable();
0220     d_components.clear();
0221     d_components.push_back(comp);
0222 }
0223 
0224 } // namespace Codethink::lvtmdb