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