kim-api  2.3.1-git+v2.3.0-git-2-g378406f9.GNU.GNU.
An Application Programming Interface (API) for the Knowledgebase of Interatomic Models (KIM).
kim_language_name_module.f90
Go to the documentation of this file.
1 !
2 ! KIM-API: An API for interatomic models
3 ! Copyright (c) 2013--2022, Regents of the University of Minnesota.
4 ! All rights reserved.
5 !
6 ! Contributors:
7 ! Ryan S. Elliott
8 !
9 ! SPDX-License-Identifier: LGPL-2.1-or-later
10 !
11 ! This library is free software; you can redistribute it and/or
12 ! modify it under the terms of the GNU Lesser General Public
13 ! License as published by the Free Software Foundation; either
14 ! version 2.1 of the License, or (at your option) any later version.
15 !
16 ! This library is distributed in the hope that it will be useful,
17 ! but WITHOUT ANY WARRANTY; without even the implied warranty of
18 ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 ! Lesser General Public License for more details.
20 !
21 ! You should have received a copy of the GNU Lesser General Public License
22 ! along with this library; if not, write to the Free Software Foundation,
23 ! Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 !
25 
26 !
27 ! Release: This file is part of the kim-api.git repository.
28 !
29 
36  use, intrinsic :: iso_c_binding
37  implicit none
38  private
39 
40  public &
41  ! Derived types
42  kim_language_name_type, &
43  ! Constants
47  ! Routines
48  kim_known, &
49  operator(.eq.), &
50  operator(.ne.), &
51  kim_from_string, &
52  kim_to_string, &
55 
61  type, bind(c) :: kim_language_name_type
67  integer(c_int) :: language_name_id
68  end type kim_language_name_type
69 
75  type(kim_language_name_type), protected, save, &
76  bind(c, name="KIM_LANGUAGE_NAME_cpp") &
78 
84  type(kim_language_name_type), protected, save, &
85  bind(c, name="KIM_LANGUAGE_NAME_c") &
87 
93  type(kim_language_name_type), protected, save, &
94  bind(c, name="KIM_LANGUAGE_NAME_fortran") &
96 
102  interface kim_known
103  module procedure kim_language_name_known
104  end interface kim_known
105 
111  interface operator(.eq.)
112  module procedure kim_language_name_equal
113  end interface operator(.eq.)
114 
120  interface operator(.ne.)
121  module procedure kim_language_name_not_equal
122  end interface operator(.ne.)
123 
130  interface kim_from_string
131  module procedure kim_language_name_from_string
132  end interface kim_from_string
133 
139  interface kim_to_string
140  module procedure kim_language_name_to_string
141  end interface kim_to_string
142 
143 contains
149  logical recursive function kim_language_name_known(language_name)
150  implicit none
151  interface
152  integer(c_int) recursive function known(language_name) &
153  bind(c, name="KIM_LanguageName_Known")
154  use, intrinsic :: iso_c_binding
155  import kim_language_name_type
156  implicit none
157  type(kim_language_name_type), intent(in), value :: language_name
158  end function known
159  end interface
160  type(kim_language_name_type), intent(in) :: language_name
161 
162  kim_language_name_known = (known(language_name) /= 0)
163  end function kim_language_name_known
164 
170  logical recursive function kim_language_name_equal(lhs, rhs)
171  implicit none
172  type(kim_language_name_type), intent(in) :: lhs
173  type(kim_language_name_type), intent(in) :: rhs
174 
175  kim_language_name_equal &
176  = (lhs%language_name_id == rhs%language_name_id)
177  end function kim_language_name_equal
178 
184  logical recursive function kim_language_name_not_equal(lhs, rhs)
185  implicit none
186  type(kim_language_name_type), intent(in) :: lhs
187  type(kim_language_name_type), intent(in) :: rhs
188 
189  kim_language_name_not_equal = .not. (lhs == rhs)
190  end function kim_language_name_not_equal
191 
198  recursive subroutine kim_language_name_from_string(string, language_name)
199  implicit none
200  interface
201  type(kim_language_name_type) recursive function from_string(string) &
202  bind(c, name="KIM_LanguageName_FromString")
203  use, intrinsic :: iso_c_binding
204  import kim_language_name_type
205  implicit none
206  character(c_char), intent(in) :: string(*)
207  end function from_string
208  end interface
209  character(len=*, kind=c_char), intent(in) :: string
210  type(kim_language_name_type), intent(out) :: language_name
211 
212  language_name = from_string(trim(string)//c_null_char)
213  end subroutine kim_language_name_from_string
214 
220  recursive subroutine kim_language_name_to_string(language_name, string)
221  use kim_convert_string_module, only: kim_convert_c_char_ptr_to_string
222  implicit none
223  interface
224  type(c_ptr) recursive function get_string(language_name) &
225  bind(c, name="KIM_LanguageName_ToString")
226  use, intrinsic :: iso_c_binding
227  import kim_language_name_type
228  implicit none
229  type(kim_language_name_type), intent(in), value :: language_name
230  end function get_string
231  end interface
232  type(kim_language_name_type), intent(in) :: language_name
233  character(len=*, kind=c_char), intent(out) :: string
234 
235  type(c_ptr) :: p
236 
237  p = get_string(language_name)
238  call kim_convert_c_char_ptr_to_string(p, string)
239  end subroutine kim_language_name_to_string
240 
247  recursive subroutine kim_get_number_of_language_names( &
248  number_of_language_names)
249  implicit none
250  interface
251  recursive subroutine get_number_of_language_names( &
252  number_of_language_names) &
253  bind(c, name="KIM_LANGUAGE_NAME_GetNumberOfLanguageNames")
254  use, intrinsic :: iso_c_binding
255  integer(c_int), intent(out) :: number_of_language_names
256  end subroutine get_number_of_language_names
257  end interface
258  integer(c_int), intent(out) :: number_of_language_names
259 
260  call get_number_of_language_names(number_of_language_names)
261  end subroutine kim_get_number_of_language_names
262 
268  recursive subroutine kim_get_language_name(index, language_name, ierr)
269  implicit none
270  interface
271  integer(c_int) recursive function get_language_name(index, &
272  language_name) &
273  bind(c, name="KIM_LANGUAGE_NAME_GetLanguageName")
274  use, intrinsic :: iso_c_binding
275  import kim_language_name_type
276  integer(c_int), intent(in), value :: index
277  type(kim_language_name_type), intent(out) :: language_name
278  end function get_language_name
279  end interface
280  integer(c_int), intent(in) :: index
281  type(kim_language_name_type), intent(out) :: language_name
282  integer(c_int), intent(out) :: ierr
283 
284  ierr = get_language_name(index - 1, language_name)
285  end subroutine kim_get_language_name
286 end module kim_language_name_module
type(kim_language_name_type), save, public, protected kim_language_name_cpp
recursive subroutine, public kim_get_number_of_language_names(number_of_language_names)
Get the number of standard LanguageName's defined by the KIM API.
recursive subroutine, public kim_get_language_name(index, language_name, ierr)
Get the identity of each defined standard LanguageName.
type(kim_language_name_type), save, public, protected kim_language_name_c
An Extensible Enumeration for the LanguageName's supported by the KIM API.
type(kim_language_name_type), save, public, protected kim_language_name_fortran