Returns true if all the children are the same type (and a scalar).
Note that integers and reals are considered the same type for this purpose.
This routine is used for the compress_vectors
option.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(json_core), | intent(inout) | :: | json | |||
type(json_value), | pointer | :: | p |
if all elements of a vector are scalars of the same type
function json_is_vector(json, p) result(is_vector)
implicit none
class(json_core),intent(inout) :: json
type(json_value),pointer :: p
logical(LK) :: is_vector !! if all elements of a vector
!! are scalars of the same type
integer(IK) :: var_type_prev !! for getting the variable type of children
integer(IK) :: var_type !! for getting the variable type of children
type(json_value),pointer :: element !! for getting children
integer(IK) :: i !! counter
integer(IK) :: count !! number of children
integer(IK),parameter :: json_invalid = -1_IK !! to initialize the flag. an invalid value
integer(IK),parameter :: json_numeric = -2_IK !! indicates `json_integer` or `json_real`
if (json%compress_vectors) then
! check to see if every child is the same type,
! and a scalar:
is_vector = .true.
var_type_prev = json_invalid
count = json%count(p)
element => p%children
do i = 1_IK, count
if (.not. associated(element)) then
call json%throw_exception('Error in json_is_vector: '//&
'Malformed JSON linked list')
return
end if
! check variable type of all the children.
! They must all be the same, and a scalar.
call json%info(element,var_type=var_type)
! special check for numeric values:
if (var_type==json_integer .or. var_type==json_real) var_type = json_numeric
if (var_type==json_object .or. &
var_type==json_array .or. &
(i>1_IK .and. var_type/=var_type_prev)) then
is_vector = .false.
exit
end if
var_type_prev = var_type
! get the next child the list:
element => element%next
end do
else
is_vector = .false.
end if
end function json_is_vector