# t20006 - Class template specialization basic sequence diagram
## Config
```yaml
compilation_database_dir: ..
output_directory: puml
diagrams:
  t20006_sequence:
    type: sequence
    glob:
      - ../../tests/t20006/t20006.cc
    include:
      namespaces:
        - clanguml::t20006
    using_namespace:
      - clanguml::t20006
    start_from:
      - function: "clanguml::t20006::tmain()"
```
## Source code
File t20006.cc
```cpp
#include <string>

namespace clanguml {
namespace t20006 {

template <typename T> struct A {
    T a1(T arg) { return arg; }
    T a2(T arg) { return arg + arg; }
};

template <typename T> struct B {
    T b(T arg) { return a_.a1(arg); }
    A<T> a_;
};

template <> struct B<std::string> {
    std::string b(std::string arg) { return a_.a2(arg); }
    A<std::string> a_;
};

template <typename T> struct AA {
    void aa1(T t) { }
    void aa2(T t) { }
};

template <typename T, typename F> struct BB {
    void bb1(T t, F f) { aa_.aa1(t); }
    void bb2(T t, F f) { aa_.aa2(t); }

    AA<T> aa_;
};

template <typename T> struct BB<T, std::string> {
    void bb1(T t, std::string f) { aa_->aa2(t); }
    void bb2(T t, std::string f) { aa_->aa1(t); }

    BB(AA<T> *aa)
        : aa_{aa}
    {
    }

    AA<T> *aa_;
};

template <typename T> struct BB<T, float> {
    void bb1(T t, float f) { bb2(t, f); }
    void bb2(T t, float f) { aa_.aa2(t); }

    BB(AA<T> &aa)
        : aa_{aa}
    {
    }

    AA<T> &aa_;
};

void tmain()
{
    B<int> bint;
    B<std::string> bstring;

    bint.b(1);
    bstring.b("bstring");

    BB<int, int> bbint;
    AA<int> aaint;
    BB<int, std::string> bbstring{&aaint};
    BB<int, float> bbfloat{aaint};

    bbint.bb1(1, 1);
    bbint.bb2(2, 2);

    bbstring.bb1(1, "calling aa2");
    bbstring.bb2(1, "calling aa1");

    bbfloat.bb1(1, 1.0f);
}
}
}
```
## Generated UML diagrams
![t20006_sequence](./t20006_sequence.svg "Class template specialization basic sequence diagram")
## Generated JSON models
```json
{
  "diagram_type": "sequence",
  "metadata": {
    "clang_uml_version": "0.3.5-27-g81c7ce7",
    "llvm_version": "Ubuntu clang version 15.0.6",
    "schema_version": 1
  },
  "name": "t20006_sequence",
  "participants": [
    {
      "id": "363965584448680958",
      "name": "clanguml::t20006::tmain()",
      "source_location": {
        "file": "../../tests/t20006/t20006.cc",
        "line": 57
      },
      "type": "function"
    },
    {
      "id": "2197760498261923035",
      "name": "clanguml::t20006::B<int>",
      "source_location": {
        "file": "../../tests/t20006/t20006.cc",
        "line": 11
      },
      "type": "class"
    },
    {
      "id": "596484796124829039",
      "name": "clanguml::t20006::A<int>",
      "source_location": {
        "file": "../../tests/t20006/t20006.cc",
        "line": 6
      },
      "type": "class"
    },
    {
      "id": "2102622661983365981",
      "name": "clanguml::t20006::B<std::string>",
      "source_location": {
        "file": "../../tests/t20006/t20006.cc",
        "line": 16
      },
      "type": "class"
    },
    {
      "id": "413459875415381273",
      "name": "clanguml::t20006::A<std::string>",
      "source_location": {
        "file": "../../tests/t20006/t20006.cc",
        "line": 6
      },
      "type": "class"
    },
    {
      "id": "264392653889863384",
      "name": "clanguml::t20006::BB<int,int>",
      "source_location": {
        "file": "../../tests/t20006/t20006.cc",
        "line": 26
      },
      "type": "class"
    },
    {
      "id": "1903567228894636312",
      "name": "clanguml::t20006::AA<int>",
      "source_location": {
        "file": "../../tests/t20006/t20006.cc",
        "line": 21
      },
      "type": "class"
    },
    {
      "id": "2269742833301555472",
      "name": "clanguml::t20006::BB<int,std::string>",
      "source_location": {
        "file": "../../tests/t20006/t20006.cc",
        "line": 33
      },
      "type": "class"
    },
    {
      "id": "1743503037360505162",
      "name": "clanguml::t20006::BB<int,float>",
      "source_location": {
        "file": "../../tests/t20006/t20006.cc",
        "line": 45
      },
      "type": "class"
    }
  ],
  "sequences": [
    {
      "messages": [
        {
          "from": {
            "activity_id": "363965584448680958",
            "activity_name": "clanguml::t20006::tmain()",
            "participant_id": "363965584448680958",
            "participant_name": "clanguml::t20006::tmain()"
          },
          "name": "b(int)",
          "return_type": "int",
          "scope": "normal",
          "source_location": {
            "file": "../../tests/t20006/t20006.cc",
            "line": 62
          },
          "to": {
            "activity_id": "250247217888843587",
            "activity_name": "clanguml::t20006::B<int>::b(int)",
            "participant_id": "2197760498261923035"
          },
          "type": "message"
        },
        {
          "from": {
            "activity_id": "250247217888843587",
            "activity_name": "clanguml::t20006::B<int>::b(int)",
            "participant_id": "2197760498261923035"
          },
          "name": "a1(int)",
          "return_type": "int",
          "scope": "normal",
          "source_location": {
            "file": "../../tests/t20006/t20006.cc",
            "line": 12
          },
          "to": {
            "activity_id": "196390487987395669",
            "activity_name": "clanguml::t20006::A<int>::a1(int)",
            "participant_id": "596484796124829039"
          },
          "type": "message"
        },
        {
          "from": {
            "activity_id": "363965584448680958",
            "activity_name": "clanguml::t20006::tmain()",
            "participant_id": "363965584448680958",
            "participant_name": "clanguml::t20006::tmain()"
          },
          "name": "b(std::string)",
          "return_type": "std::string",
          "scope": "normal",
          "source_location": {
            "file": "../../tests/t20006/t20006.cc",
            "line": 63
          },
          "to": {
            "activity_id": "13049632552871157",
            "activity_name": "clanguml::t20006::B<std::string>::b(std::string)",
            "participant_id": "2102622661983365981"
          },
          "type": "message"
        },
        {
          "from": {
            "activity_id": "13049632552871157",
            "activity_name": "clanguml::t20006::B<std::string>::b(std::string)",
            "participant_id": "2102622661983365981"
          },
          "name": "a2(std::string)",
          "return_type": "class std::basic_string<char>",
          "scope": "normal",
          "source_location": {
            "file": "../../tests/t20006/t20006.cc",
            "line": 17
          },
          "to": {
            "activity_id": "11762588624112907",
            "activity_name": "clanguml::t20006::A<std::string>::a2(std::string)",
            "participant_id": "413459875415381273"
          },
          "type": "message"
        },
        {
          "from": {
            "activity_id": "363965584448680958",
            "activity_name": "clanguml::t20006::tmain()",
            "participant_id": "363965584448680958",
            "participant_name": "clanguml::t20006::tmain()"
          },
          "name": "bb1(int,int)",
          "return_type": "void",
          "scope": "normal",
          "source_location": {
            "file": "../../tests/t20006/t20006.cc",
            "line": 70
          },
          "to": {
            "activity_id": "1213865121829347654",
            "activity_name": "clanguml::t20006::BB<int,int>::bb1(int,int)",
            "participant_id": "264392653889863384"
          },
          "type": "message"
        },
        {
          "from": {
            "activity_id": "1213865121829347654",
            "activity_name": "clanguml::t20006::BB<int,int>::bb1(int,int)",
            "participant_id": "264392653889863384"
          },
          "name": "aa1(int)",
          "return_type": "void",
          "scope": "normal",
          "source_location": {
            "file": "../../tests/t20006/t20006.cc",
            "line": 27
          },
          "to": {
            "activity_id": "1235428163990670191",
            "activity_name": "clanguml::t20006::AA<int>::aa1(int)",
            "participant_id": "1903567228894636312"
          },
          "type": "message"
        },
        {
          "from": {
            "activity_id": "363965584448680958",
            "activity_name": "clanguml::t20006::tmain()",
            "participant_id": "363965584448680958",
            "participant_name": "clanguml::t20006::tmain()"
          },
          "name": "bb2(int,int)",
          "return_type": "void",
          "scope": "normal",
          "source_location": {
            "file": "../../tests/t20006/t20006.cc",
            "line": 71
          },
          "to": {
            "activity_id": "361650123916792854",
            "activity_name": "clanguml::t20006::BB<int,int>::bb2(int,int)",
            "participant_id": "264392653889863384"
          },
          "type": "message"
        },
        {
          "from": {
            "activity_id": "361650123916792854",
            "activity_name": "clanguml::t20006::BB<int,int>::bb2(int,int)",
            "participant_id": "264392653889863384"
          },
          "name": "aa2(int)",
          "return_type": "void",
          "scope": "normal",
          "source_location": {
            "file": "../../tests/t20006/t20006.cc",
            "line": 28
          },
          "to": {
            "activity_id": "582097827335267290",
            "activity_name": "clanguml::t20006::AA<int>::aa2(int)",
            "participant_id": "1903567228894636312"
          },
          "type": "message"
        },
        {
          "from": {
            "activity_id": "363965584448680958",
            "activity_name": "clanguml::t20006::tmain()",
            "participant_id": "363965584448680958",
            "participant_name": "clanguml::t20006::tmain()"
          },
          "name": "bb1(int,std::string)",
          "return_type": "void",
          "scope": "normal",
          "source_location": {
            "file": "../../tests/t20006/t20006.cc",
            "line": 73
          },
          "to": {
            "activity_id": "1062874005712014125",
            "activity_name": "clanguml::t20006::BB<int,std::string>::bb1(int,std::string)",
            "participant_id": "2269742833301555472"
          },
          "type": "message"
        },
        {
          "from": {
            "activity_id": "1062874005712014125",
            "activity_name": "clanguml::t20006::BB<int,std::string>::bb1(int,std::string)",
            "participant_id": "2269742833301555472"
          },
          "name": "aa2(int)",
          "return_type": "void",
          "scope": "normal",
          "source_location": {
            "file": "../../tests/t20006/t20006.cc",
            "line": 34
          },
          "to": {
            "activity_id": "582097827335267290",
            "activity_name": "clanguml::t20006::AA<int>::aa2(int)",
            "participant_id": "1903567228894636312"
          },
          "type": "message"
        },
        {
          "from": {
            "activity_id": "363965584448680958",
            "activity_name": "clanguml::t20006::tmain()",
            "participant_id": "363965584448680958",
            "participant_name": "clanguml::t20006::tmain()"
          },
          "name": "bb2(int,std::string)",
          "return_type": "void",
          "scope": "normal",
          "source_location": {
            "file": "../../tests/t20006/t20006.cc",
            "line": 74
          },
          "to": {
            "activity_id": "787705189994778234",
            "activity_name": "clanguml::t20006::BB<int,std::string>::bb2(int,std::string)",
            "participant_id": "2269742833301555472"
          },
          "type": "message"
        },
        {
          "from": {
            "activity_id": "787705189994778234",
            "activity_name": "clanguml::t20006::BB<int,std::string>::bb2(int,std::string)",
            "participant_id": "2269742833301555472"
          },
          "name": "aa1(int)",
          "return_type": "void",
          "scope": "normal",
          "source_location": {
            "file": "../../tests/t20006/t20006.cc",
            "line": 35
          },
          "to": {
            "activity_id": "1235428163990670191",
            "activity_name": "clanguml::t20006::AA<int>::aa1(int)",
            "participant_id": "1903567228894636312"
          },
          "type": "message"
        },
        {
          "from": {
            "activity_id": "363965584448680958",
            "activity_name": "clanguml::t20006::tmain()",
            "participant_id": "363965584448680958",
            "participant_name": "clanguml::t20006::tmain()"
          },
          "name": "bb1(int,float)",
          "return_type": "void",
          "scope": "normal",
          "source_location": {
            "file": "../../tests/t20006/t20006.cc",
            "line": 76
          },
          "to": {
            "activity_id": "1463188845572485713",
            "activity_name": "clanguml::t20006::BB<int,float>::bb1(int,float)",
            "participant_id": "1743503037360505162"
          },
          "type": "message"
        },
        {
          "from": {
            "activity_id": "1463188845572485713",
            "activity_name": "clanguml::t20006::BB<int,float>::bb1(int,float)",
            "participant_id": "1743503037360505162"
          },
          "name": "bb2(int,float)",
          "return_type": "void",
          "scope": "normal",
          "source_location": {
            "file": "../../tests/t20006/t20006.cc",
            "line": 46
          },
          "to": {
            "activity_id": "732362671329401903",
            "activity_name": "clanguml::t20006::BB<int,float>::bb2(int,float)",
            "participant_id": "1743503037360505162"
          },
          "type": "message"
        },
        {
          "from": {
            "activity_id": "732362671329401903",
            "activity_name": "clanguml::t20006::BB<int,float>::bb2(int,float)",
            "participant_id": "1743503037360505162"
          },
          "name": "aa2(int)",
          "return_type": "void",
          "scope": "normal",
          "source_location": {
            "file": "../../tests/t20006/t20006.cc",
            "line": 47
          },
          "to": {
            "activity_id": "582097827335267290",
            "activity_name": "clanguml::t20006::AA<int>::aa2(int)",
            "participant_id": "1903567228894636312"
          },
          "type": "message"
        }
      ],
      "start_from": {
        "id": 363965584448680958,
        "location": "clanguml::t20006::tmain()"
      }
    }
  ],
  "using_namespace": "clanguml::t20006"
}
```
