31 integer,
parameter,
public :: MAX_NAMESPACE_LEN = 128
35 character(len=MAX_NAMESPACE_LEN) :: name =
""
36 type(namespace_t),
pointer,
public :: parent => null()
40 generic ::
operator(==) => equal
47 procedure namespace_constructor
50 type(namespace_t) :: global_namespace
59 recursive type(namespace_t) function namespace_constructor(name, parent, delimiter)
60 character(len=*),
intent(in) :: name
61 type(namespace_t),
optional,
target,
intent(in) :: parent
62 character(len=1),
optional,
intent(in) :: delimiter
64 integer :: total_len, parent_len
65 character(len=1) :: delimiter_
67 if (
present(delimiter))
then
68 delimiter_ = delimiter
74 total_len = len_trim(name)
75 if (
present(parent))
then
76 parent_len = parent%len()
77 if (parent_len > 0)
then
78 total_len = total_len + parent_len + 1
83 if (total_len > max_namespace_len)
then
84 write(stderr,
'(a)')
'*** Fatal Error (description follows)'
85 write(stderr,
'(a)')
'Trying to create the following namespace:'
86 if (
present(parent))
then
87 if (parent%len() > 0)
then
88 write(stderr,
'(a)') trim(parent%get()) // delimiter_ // name
91 write(stderr,
'(a)') name
93 write(stderr,
'(a,i4,a)')
'but namespaces are limited to ', max_namespace_len,
' characters'
101 assert(len_trim(name) > 0)
103 namespace_constructor%name = name
104 if (
present(parent))
then
105 namespace_constructor%parent => parent
107 nullify(namespace_constructor%parent)
113 recursive function namespace_get(this, delimiter)
result(name)
114 class(namespace_t),
intent(in) :: this
115 character(len=1),
optional,
intent(in) :: delimiter
116 character(len=MAX_NAMESPACE_LEN) :: name
118 character(len=1) :: delimiter_
120 if (
present(delimiter))
then
121 delimiter_ = delimiter
127 if (
associated(this%parent))
then
128 if (len_trim(name) > 0 .and. this%parent%len() > 0)
then
129 name = trim(this%parent%get(delimiter_)) // delimiter_ // trim(name)
140 integer :: parent_len
143 if (
associated(this%parent))
then
144 parent_len = this%parent%len()
145 if (parent_len > 0)
then
166 logical :: found_ancestor
167 type(
namespace_t),
pointer :: this_ancestor, namespace_ancestor
170 found_ancestor = .false.
171 namespace_ancestor => namespace
172 do while (
associated(namespace_ancestor))
173 found_ancestor = namespace_ancestor == this
174 if (found_ancestor)
exit
175 namespace_ancestor => namespace_ancestor%parent
178 if (found_ancestor)
then
181 this_ancestor => this
182 do while (
associated(namespace_ancestor%parent) .and.
associated(this_ancestor%parent))
185 this_ancestor => this_ancestor%parent
186 namespace_ancestor => namespace_ancestor%parent
198 character(len=*),
intent(in) :: name
199 character(len=1),
optional,
intent(in) :: delimiter
202 character(len=1) :: delimiter_
206 if (
present(delimiter))
then
207 delimiter_ = delimiter
213 si = index(name, delimiter_, back=.
true.)
214 namespace%name = name(si+1:len(name))
218 si = index(name(:se-1), delimiter_, back=.
true.)
219 allocate(next%parent)
220 next%parent =
namespace_t(name(si+1:se-1), delimiter=delimiter)
225 is_contained = namespace%contains(this)
228 parent => namespace%parent
229 do while (
associated(parent))
230 next => parent%parent
type(mpi_grp_t), public mpi_world
integer, public mpi_err
used to store return values of mpi calls
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)