mirror of
https://github.com/abapGit/abapGit.git
synced 2025-05-03 13:26:12 +08:00
103 lines
2.4 KiB
ABAP
103 lines
2.4 KiB
ABAP
CLASS zcl_abapgit_zlib_huffman DEFINITION
|
|
PUBLIC
|
|
CREATE PUBLIC .
|
|
|
|
PUBLIC SECTION.
|
|
|
|
TYPES:
|
|
ty_lengths TYPE STANDARD TABLE OF i WITH DEFAULT KEY .
|
|
|
|
CONSTANTS c_maxbits TYPE i VALUE 15 ##NO_TEXT.
|
|
|
|
METHODS constructor
|
|
IMPORTING
|
|
!it_lengths TYPE ty_lengths .
|
|
METHODS get_count
|
|
IMPORTING
|
|
!iv_index TYPE i
|
|
RETURNING
|
|
VALUE(rv_value) TYPE i .
|
|
METHODS get_symbol
|
|
IMPORTING
|
|
!iv_index TYPE i
|
|
RETURNING
|
|
VALUE(rv_value) TYPE i .
|
|
PROTECTED SECTION.
|
|
PRIVATE SECTION.
|
|
|
|
DATA: mt_count TYPE STANDARD TABLE OF i WITH DEFAULT KEY,
|
|
mt_symbol TYPE STANDARD TABLE OF i WITH DEFAULT KEY.
|
|
|
|
ENDCLASS.
|
|
|
|
|
|
|
|
CLASS ZCL_ABAPGIT_ZLIB_HUFFMAN IMPLEMENTATION.
|
|
|
|
|
|
METHOD constructor.
|
|
|
|
DATA: lv_index TYPE i,
|
|
lt_offset TYPE TABLE OF i,
|
|
lv_length LIKE LINE OF it_lengths,
|
|
lv_prev TYPE i,
|
|
lv_count LIKE LINE OF mt_count.
|
|
|
|
FIELD-SYMBOLS: <lv_offset> LIKE LINE OF lt_offset,
|
|
<lv_symbol> LIKE LINE OF mt_symbol,
|
|
<lv_i> LIKE LINE OF it_lengths.
|
|
|
|
|
|
DO c_maxbits TIMES.
|
|
APPEND 0 TO mt_count.
|
|
ENDDO.
|
|
LOOP AT it_lengths INTO lv_index.
|
|
IF lv_index = 0.
|
|
CONTINUE.
|
|
ENDIF.
|
|
READ TABLE mt_count INDEX lv_index ASSIGNING <lv_i>.
|
|
ASSERT sy-subrc = 0.
|
|
<lv_i> = <lv_i> + 1.
|
|
ENDLOOP.
|
|
|
|
************
|
|
|
|
APPEND 0 TO lt_offset.
|
|
DO c_maxbits - 1 TIMES.
|
|
READ TABLE mt_count INDEX sy-index INTO lv_count.
|
|
ASSERT sy-subrc = 0.
|
|
lv_prev = lv_prev + lv_count.
|
|
APPEND lv_prev TO lt_offset.
|
|
ENDDO.
|
|
|
|
DO lines( it_lengths ) TIMES.
|
|
APPEND 0 TO mt_symbol.
|
|
ENDDO.
|
|
DO lines( it_lengths ) TIMES.
|
|
lv_index = sy-index.
|
|
READ TABLE it_lengths INDEX lv_index INTO lv_length.
|
|
ASSERT sy-subrc = 0.
|
|
IF lv_length = 0.
|
|
CONTINUE.
|
|
ENDIF.
|
|
READ TABLE lt_offset INDEX lv_length ASSIGNING <lv_offset>.
|
|
ASSERT sy-subrc = 0.
|
|
READ TABLE mt_symbol INDEX <lv_offset> + 1 ASSIGNING <lv_symbol>.
|
|
ASSERT sy-subrc = 0.
|
|
<lv_symbol> = lv_index - 1.
|
|
<lv_offset> = <lv_offset> + 1.
|
|
ENDDO.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD get_count.
|
|
READ TABLE mt_count INDEX iv_index INTO rv_value. "#EC CI_SUBRC
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD get_symbol.
|
|
READ TABLE mt_symbol INDEX iv_index INTO rv_value. "#EC CI_SUBRC
|
|
ENDMETHOD.
|
|
ENDCLASS.
|