@startuml

title Eclipse iceoryx Component Overview

skinparam BackgroundColor transparent
skinparam componentStyle uml2

skinparam component {
   backgroundColor<<namespace>> yellow
}

skinparam package {
   backgroundColor green
}

skinparam frame {
   backgroundColor chocolate
}

' PlantUML package: CMake package
' PlantUML frame: CMake library

' @todo #539
' RouDi split, separate files and namespaces for static/dynamic discovery
' Implement exported libraries (add_library in iceoryx_posh/CMakeLists.txt)
' RouDiEnvironment shall not be in roudi namespace, but in testing

header Eclipse iceoryx component overview

' HOOFS: Helpful Objects Optimised For Safety
' Library containing modern C++ STL constructs
package iceoryx_hoofs  {
   frame "hoofs library" {
      component concurrent <<namespace>>
      component cxx <<namespace>> {
         component newtype <<namespace>>
         component set <<namespace>>
         component algorithm <<namespace>>
      }
      component DesignPattern <<namespace>>
      component errors <<namespace>>
      component log <<namespace>> {
         component ffbb <<namespace>>
      }
      component units <<namespace>> {
         component duration_literals <<namespace>>

      }
      component posix <<namespace>>

      ' Building blocks which only meet quality level 5
      ' Can be analysed with tools/analyse_blacklisted_namespaces_in_binary.sh
      ' component aux <<namespace>>
   }
}

' POSH: POSIX SHared memory
' Publish/subscribe IPC communication infrastructure based on shared memory
package iceoryx_posh {
   frame "core library" {
      component popo <<namespace>>
      component capro <<namespace>>
      component mepoo <<namespace>>
      component version <<namespace>>
      component build <<namespace>>
   }

   frame "runtime library" {
      component runtime <<namespace>>
   }

   frame "gateway library" {
      component gw <<namespace>>
   }

   frame "config library" {
      component config <<namespace>>
   }

   component errors <<namespace>>

   frame "RouDi library" {
      component roudi <<namespace>>
   }
}

' DDS: Data Distribution Service
'
package iceoryx_dds  {
   component dds <<namespace>>
   component gw <<namespace>> as gateway_dds
}

' C-Binding
package iceoryx_binding_c  {
   component cpp2c <<namespace>>
   component c2cpp <<namespace>>
}


' Introspection
package iceoryx_introspection  {
   component client <<namespace>> {
      component introspection <<namespace>>
   }
}

iceoryx_posh  ..>  iceoryx_hoofs  : use
iceoryx_dds  ..>  iceoryx_posh  : use
iceoryx_binding_c  ..>  iceoryx_posh  : use
introspection  ..>  iceoryx_posh  : use
@enduml
