indexing description: "ID in UUID format" author: "Beat Strasser " date: "$Date$" revision: "$Revision$" deferred class P2P_ID_UUID inherit P2P_UUID_TOOLS undefine out, is_equal end P2P_ID redefine parse_unique_id, is_unique_id_valid end feature -- Access format: STRING is "uuid" bytes: ARRAY [NATURAL_8] flag_id_type: NATURAL_8 is -- Current flag id type deferred end Minimal_bytes_count: INTEGER is 1 Maximal_bytes_count: INTEGER is 64 Flags_bytes_count: INTEGER is 1 feature -- Status report is_unique_id_valid (an_id: STRING): BOOLEAN is -- Is `an_id' a valid unique id? do Result := Precursor (an_id) and an_id.count \\ 2 = 0 and an_id.count >= minimal_bytes_count * 2 and an_id.count <= maximal_bytes_count * 2 end feature {NONE} -- Implementation parse_unique_id is -- Parse `unique_id'. local source_pos: INTEGER do -- make sure, id is in uppercase form unique_id.to_upper -- parse id to array from source_pos := 1 initialize_bytes until source_pos > unique_id.count - flags_bytes_count * 2 loop bytes[source_pos // 2] := hex_to_natural_8 (unique_id.item (source_pos), unique_id.item (source_pos + 1)) source_pos := source_pos + 2 end -- parse flags bytes[maximal_bytes_count - 1] := hex_to_natural_8 (unique_id.item (unique_id.count - 1), unique_id.item (unique_id.count)) -- parse bytes parse_bytes end parse_bytes is -- Parse `bytes'. Do nothing, redefine if necessary. do end initialize_bytes is -- Initialize bytes array do create bytes.make (minimal_bytes_count - 1, maximal_bytes_count - 1) end build_uuidformat is -- Build uuid format local id: STRING last, pos: INTEGER do -- look for last used byte (except the flag) from last := maximal_bytes_count - 2 until last < 0 or bytes[last] /= 0 loop last := last - 1 end -- build hex string create id.make (maximal_bytes_count + 1) from pos := 0 until pos > last loop id.append (bytes[pos].to_hex_string) pos := pos + 1 end bytes[maximal_bytes_count - 1] := flag_id_type id.append (flag_id_type.to_hex_string) id.to_upper -- P2P_ID initialization make_with_id (id) end end