class JSON_INTERVALS_OBJECT
List of JSON parsed string value substring intervals indexed by cached field: EL_ENUMERATION [NATURAL_16]
note
description: "[
List of JSON parsed string value substring intervals indexed by cached field:
${EL_ENUMERATION [NATURAL_16]}
]"
author: "Finnian Reilly"
copyright: "Copyright (c) 2001-2022 Finnian Reilly"
contact: "finnian at eiffel hyphen loop dot com"
license: "MIT license (See: en.wikipedia.org/wiki/MIT_License)"
date: "2024-11-06 11:34:45 GMT (Wednesday 6th November 2024)"
revision: "18"
class
JSON_INTERVALS_OBJECT [FIELD_ENUM -> EL_ENUMERATION_NATURAL_16 create make end]
inherit
EL_SEQUENTIAL_INTERVALS
rename
make as make_intervals,
index as substring_index
export
{NONE} all
end
EL_MODULE_EIFFEL
EL_SHARED_ZSTRING_BUFFER_POOL
create
make
feature {NONE} -- Initialization
make (utf_8: READABLE_STRING_8)
require
new_line_delimited: utf_8.has ('%N')
local
field_list: JSON_NAME_VALUE_LIST; field_index, text_count: INTEGER
do
area_v2 := Default_area -- To satisfy invariant
if attached {FIELD_ENUM} Enumeration_by_type.item (Current) as enumeration then
field := enumeration
make_filled_area (0, field.count * 2)
end
create field_list.make (utf_8)
if attached String_pool.borrowed_item as borrowed then
if attached borrowed.empty as text then
from field_list.start until field_list.after loop
if field.has_name (field_list.item_immutable_name) then
text_count := text.count
field_index := field.found_value
text.append_utf_8 (field_list.item_immutable_value)
put_i_th (text_count + 1, text.count, field_index)
end
field_list.forth
end
text_values := text.twin
end
borrowed.return
end
end
feature -- Measurement
physical_size: INTEGER
do
-- `field' enumeration is not included because it is shared across objects
Result := Eiffel.physical_size (Current) + Eiffel.deep_physical_size (text_values)
+ Eiffel.deep_physical_size (area_v2)
end
feature {JSON_INTERVALS_OBJECT} -- Factory
new_enumeration: EL_ENUMERATION_NATURAL_16
do
create {FIELD_ENUM} Result.make
end
feature {NONE} -- Implementation
boolean_value (i: NATURAL_16): BOOLEAN
require
valid_index: valid_index (i)
do
Result := buffer_string_value (i).to_boolean
end
real_32_value, real_value (i: NATURAL_16): REAL
require
valid_index: valid_index (i)
do
Result := buffer_string_value (i).to_real
end
real_64_value, double_value (i: NATURAL_16): DOUBLE
require
valid_index: valid_index (i)
do
Result := buffer_string_value (i).to_double
end
natural_value, natural_32_value (i: NATURAL_16): NATURAL
require
valid_index: valid_index (i)
do
Result := buffer_string_value (i).to_natural
end
string_8_value (i: NATURAL_16): STRING
require
valid_index: valid_index (i)
do
Result := buffer_string_value (i)
end
string_value (i: NATURAL_16): ZSTRING
require
valid_index: valid_index (i)
local
j: INTEGER
do
if attached area_v2 as a then
j := (i - 1) * 2
Result := text_values.substring (a [j], a [j + 1])
else
create Result.make_empty
end
end
buffer_string_value (i: NATURAL_16): ZSTRING
require
valid_index: valid_index (i)
local
buffer: EL_ZSTRING_BUFFER_ROUTINES; j: INTEGER
do
if attached area_v2 as a then
j := (i - 1) * 2
Result := buffer.copied_substring (text_values, a [j], a [j + 1])
else
create Result.make_empty
end
end
feature {NONE} -- Internal attributes
field: FIELD_ENUM
text_values: ZSTRING
feature {NONE} -- Constants
Default_area: SPECIAL [INTEGER]
once
create Result.make_empty (0)
end
Enumeration_by_type: EL_FUNCTION_RESULT_TABLE [
JSON_INTERVALS_OBJECT [EL_ENUMERATION_NATURAL_16], EL_ENUMERATION_NATURAL_16
]
once
create Result.make (11, agent {JSON_INTERVALS_OBJECT [EL_ENUMERATION_NATURAL_16]}.new_enumeration)
end
end