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'
88 assert(len_trim(name) > 0)
90 namespace_constructor%name = name
91 if (
present(parent))
then
92 namespace_constructor%parent => parent
94 nullify(namespace_constructor%parent)
100 recursive function namespace_get(this, delimiter)
result(name)
101 class(namespace_t),
intent(in) :: this
102 character(len=1),
optional,
intent(in) :: delimiter
103 character(len=MAX_NAMESPACE_LEN) :: name
105 character(len=1) :: delimiter_
107 if (
present(delimiter))
then
108 delimiter_ = delimiter
114 if (
associated(this%parent))
then
115 if (len_trim(name) > 0 .and. this%parent%len() > 0)
then
116 name = trim(this%parent%get(delimiter_)) // delimiter_ // trim(name)
127 integer :: parent_len
130 if (
associated(this%parent))
then
131 parent_len = this%parent%len()
132 if (parent_len > 0)
then
153 logical :: found_ancestor
154 type(
namespace_t),
pointer :: this_ancestor, namespace_ancestor
157 found_ancestor = .false.
158 namespace_ancestor => namespace
159 do while (
associated(namespace_ancestor))
160 found_ancestor = namespace_ancestor == this
161 if (found_ancestor)
exit
162 namespace_ancestor => namespace_ancestor%parent
165 if (found_ancestor)
then
168 this_ancestor => this
169 do while (
associated(namespace_ancestor%parent) .and.
associated(this_ancestor%parent))
172 this_ancestor => this_ancestor%parent
173 namespace_ancestor => namespace_ancestor%parent
185 character(len=*),
intent(in) :: name
186 character(len=1),
optional,
intent(in) :: delimiter
189 character(len=1) :: delimiter_
193 if (
present(delimiter))
then
194 delimiter_ = delimiter
200 si = index(name, delimiter_, back=.
true.)
201 namespace%name = name(si+1:len(name))
205 si = index(name(:se-1), delimiter_, back=.
true.)
206 allocate(next%parent)
207 next%parent =
namespace_t(name(si+1:se-1), delimiter=delimiter)
212 is_contained = namespace%contains(this)
215 parent => namespace%parent
216 do while (
associated(parent))
217 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)