1 // =================================
 2 // Copyright (c) 2020 Seppo Laakko
 3 // Distributed under the MIT license
 4 // =================================
 5 
 6 #include <sngcpp/symbols/ClassTemplateSpecializationSymbol.hpp>
 7 
 8 namespace sngcpp { namespace symbols {
 9 
10 std::u32string MakeClassTemplateSpecializationId(TypeSymbol* primaryClassTemplateSymbolconst std::std::vector<TypeSymbol*>&templateArgumentSymbols)
11 {
12     std::u32string id = primaryClassTemplateSymbol->Id();
13     for (TypeSymbol* templateArgument : templateArgumentSymbols)
14     {
15         id.append(U".").append(templateArgument->Id());
16     }
17     return id;
18 }
19 
20 std::u32string MakeClassTemplateSpecializationName(TypeSymbol* primaryClassTemplateSymbolconst std::std::vector<TypeSymbol*>&templateArgumentSymbols)
21 {
22     std::u32string name = primaryClassTemplateSymbol->Name();
23     name.append(1'<');
24     bool first = true;
25     for (TypeSymbol* templateArgument : templateArgumentSymbols)
26     {
27         if (first)
28         {
29             first = false;
30         }
31         else
32         {
33             name.append(U", ");
34         }
35         name.append(templateArgument->Name());
36     }
37     name.append(1'>');
38     return name;
39 }
40 
41 ClassTemplateSpecializationSymbol::ClassTemplateSpecializationSymbol(const Span& span_const std::u32string& name_TypeSymbol* primaryClassTemplateSymbol_
42     const std::std::vector<TypeSymbol*>&templateArgumentSymbols_conststd::u32string&id_):
43     ClassTypeSymbol(span_name_primaryClassTemplateSymbol_->GetClassKey())primaryClassTemplateSymbol(primaryClassTemplateSymbol_)templateArgumentSymbols(templateArgumentSymbols_)id(id_)
44 {
45 }
46 
47 bool ClassTemplateSpecializationSymbol::HasBaseClass(TypeSymbol* typeint& distance)
48 {
49     return primaryClassTemplateSymbol->HasBaseClass(typedistance);
50 }
51 
52 std::std::unique_ptr<sngxml::dom::Element>ClassTemplateSpecializationSymbol::CreateElement()
53 {
54     std::unique_ptr<sngxml::dom::Element> typeElement(new sngxml::dom::Element(U"specialization"));
55     typeElement->SetAttribute(U"primaryTypeId"primaryClassTemplateSymbol->Id());
56     std::unique_ptr<sngxml::dom::Element> templateArgumentsElement(new sngxml::dom::Element(U"templateArguments"));
57     for (TypeSymbol* templateArgument : templateArgumentSymbols)
58     {
59         std::unique_ptr<sngxml::dom::Element> templateArgumentElement(new sngxml::dom::Element(U"templateArgument"));
60         templateArgumentElement->SetAttribute(U"typeId"templateArgument->Id());
61         templateArgumentsElement->AppendChild(std::unique_ptr<sngxml::dom::Node>(templateArgumentElement.release()));
62     }
63     typeElement->AppendChild(std::unique_ptr<sngxml::dom::Node>(templateArgumentsElement.release()));
64     return typeElement;
65 }
66 
67 } } // namespace sngcpp::symbols