20  integer, 
parameter, 
public :: MAX_NAMESPACE_LEN = 128
 
   24    character(len=MAX_NAMESPACE_LEN) :: name = 
"" 
   25    type(namespace_t), 
pointer, 
public :: parent => null()
 
   29    generic   :: 
operator(==) => equal
 
   36    procedure namespace_constructor
 
   39  type(namespace_t) :: global_namespace
 
   48  recursive type(namespace_t) function namespace_constructor(name, parent, delimiter)
 
   49    character(len=*),                    
intent(in) :: name
 
   50    type(namespace_t), 
optional, 
target, 
intent(in) :: parent
 
   51    character(len=1),  
optional,         
intent(in) :: delimiter
 
   53    integer :: total_len, parent_len
 
   54    character(len=1) :: delimiter_
 
   56    if (
present(delimiter)) 
then 
   57      delimiter_ = delimiter
 
   63    total_len = len_trim(name)
 
   64    if (
present(parent)) 
then 
   65      parent_len = parent%len()
 
   66      if (parent_len > 0) 
then 
   67        total_len = total_len + parent_len + 1
 
   72    if (total_len > max_namespace_len) 
then 
   73      write(stderr,
'(a)') 
'*** Fatal Error (description follows)' 
   74      write(stderr,
'(a)') 
'Trying to create the following namespace:' 
   75      if (
present(parent)) 
then 
   76        if (parent%len() > 0) 
then 
   77          write(stderr,
'(a)') trim(parent%get()) // delimiter_ // name
 
   80        write(stderr,
'(a)') name
 
   82      write(stderr,
'(a,i4,a)') 
'but namespaces are limited to ', max_namespace_len, 
' characters' 
   87    assert(len_trim(name) > 0)
 
   89    namespace_constructor%name = name
 
   90    if (
present(parent)) 
then 
   91      namespace_constructor%parent => parent
 
   93      nullify(namespace_constructor%parent)
 
  101  recursive function namespace_get(this, delimiter) 
result(name)
 
  102    class(namespace_t),           
intent(in) :: this
 
  103    character(len=1),   
optional, 
intent(in) :: delimiter
 
  104    character(len=MAX_NAMESPACE_LEN) :: name
 
  106    character(len=1) :: delimiter_
 
  108    if (
present(delimiter)) 
then 
  109      delimiter_ = delimiter
 
  115    if (
associated(this%parent)) 
then 
  116      if (len_trim(name) > 0 .and. this%parent%len() > 0) 
then 
  117        name = trim(this%parent%get(delimiter_)) // delimiter_ // trim(name)
 
  128    integer :: parent_len
 
  131    if (
associated(this%parent)) 
then 
  132      parent_len = this%parent%len()
 
  133      if (parent_len > 0) 
then 
  154    logical :: found_ancestor
 
  155    type(
namespace_t),  
pointer :: this_ancestor, namespace_ancestor
 
  158    found_ancestor = .false.
 
  159    namespace_ancestor => namespace
 
  160    do while (
associated(namespace_ancestor))
 
  161      found_ancestor = namespace_ancestor == this
 
  162      if (found_ancestor) 
exit 
  163      namespace_ancestor => namespace_ancestor%parent
 
  166    if (found_ancestor) 
then 
  169      this_ancestor => this
 
  170      do while (
associated(namespace_ancestor%parent) .and. 
associated(this_ancestor%parent))
 
  173        this_ancestor => this_ancestor%parent
 
  174        namespace_ancestor => namespace_ancestor%parent
 
  186    character(len=*),           
intent(in) :: name
 
  187    character(len=1), 
optional, 
intent(in) :: delimiter
 
  190    character(len=1) :: delimiter_
 
  194    if (
present(delimiter)) 
then 
  195      delimiter_ = delimiter
 
  201    si = index(name, delimiter_, back=.
true.)
 
  202    namespace%name = name(si+1:len(name))
 
  206      si = index(name(:se-1), delimiter_, back=.
true.)
 
  207      allocate(next%parent)
 
  208      next%parent = 
namespace_t(name(si+1:se-1), delimiter=delimiter)
 
  213    is_contained = namespace%contains(this)
 
  216    parent => namespace%parent
 
  217    do while (
associated(parent))
 
  218      next => parent%parent
 
type(mpi_grp_t), public mpi_world
 
logical function namespace_is_contained_in(this, name, delimiter)
 
elemental logical function namespace_equal(lhs, rhs)
 
recursive type(namespace_t) function namespace_constructor(name, parent, delimiter)
Create namespace from name. If parent is present, the new namespace will be a child of it....
 
logical function namespace_contains(this, namespace)
 
type(namespace_t), public global_namespace
 
pure recursive integer function namespace_len(this)
 
recursive character(len=max_namespace_len) function namespace_get(this, delimiter)
get full name, including parents