SignedByteArray.st
author Claus Gittinger <cg@exept.de>
Tue, 02 Apr 2019 10:50:28 +0200
branchjv
changeset 24091 691c182c3105
parent 23107 40173e082cbc
permissions -rw-r--r--
#BUGFIX by cg class: CharacterArray changed: #, #asDenseUnicodeString (grafted from ba4c42171801ea3a46aea31504a621256655feae)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
19176
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     1
"
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     2
 COPYRIGHT (c) 2016 by eXept Sofware AG
23107
40173e082cbc Copyright updates
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23102
diff changeset
     3
 COPYRIGHT (c) 2018 Jan Vrany
19176
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     4
              All Rights Reserved
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     5
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     6
 This software is furnished under a license and may be used
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     7
 only in accordance with the terms of that license and with the
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     8
 inclusion of the above copyright notice.   This software may not
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     9
 be provided or otherwise made available to, or used by, any
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    10
 other person.  No title to or ownership of the software is
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    11
 hereby transferred.
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    12
"
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    13
"{ Package: 'stx:libbasic' }"
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    14
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    15
"{ NameSpace: Smalltalk }"
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    16
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    17
ByteArray variableByteSubclass:#SignedByteArray
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    18
	instanceVariableNames:''
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    19
	classVariableNames:''
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    20
	poolDictionaries:''
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    21
	category:'Collections-Arrayed'
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    22
!
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    23
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    24
!SignedByteArray class methodsFor:'documentation'!
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    25
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    26
copyright
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    27
"
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    28
 COPYRIGHT (c) 2016 by eXept Sofware AG
23107
40173e082cbc Copyright updates
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23102
diff changeset
    29
 COPYRIGHT (c) 2018 Jan Vrany
19176
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    30
              All Rights Reserved
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    31
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    32
 This software is furnished under a license and may be used
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    33
 only in accordance with the terms of that license and with the
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    34
 inclusion of the above copyright notice.   This software may not
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    35
 be provided or otherwise made available to, or used by, any
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    36
 other person.  No title to or ownership of the software is
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    37
 hereby transferred.
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    38
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    39
"
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    40
!
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    41
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    42
documentation
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    43
"
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    44
    Instances of this class hold signed bytes in the range -128 ... +127.
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    45
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    46
    [author:]
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    47
        Stefan Vogel
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    48
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    49
    [see also:]
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    50
        ByteArray
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    51
"
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    52
! !
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    53
19935
feb65418c896 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19413
diff changeset
    54
!SignedByteArray class methodsFor:'queries'!
feb65418c896 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19413
diff changeset
    55
feb65418c896 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19413
diff changeset
    56
maxVal
19941
7ccda5e648bc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 19935
diff changeset
    57
    "the maximum value which can be stored in instances of me.
7ccda5e648bc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 19935
diff changeset
    58
     For SignedByteArrays, this is 127 (largest 8bit signed int)"
19935
feb65418c896 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19413
diff changeset
    59
feb65418c896 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19413
diff changeset
    60
    ^ 127
feb65418c896 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19413
diff changeset
    61
!
feb65418c896 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19413
diff changeset
    62
feb65418c896 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19413
diff changeset
    63
minVal
19941
7ccda5e648bc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 19935
diff changeset
    64
    "the minimum value which can be stored in instances of me.
7ccda5e648bc #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 19935
diff changeset
    65
     For SignedByteArrays, this is -128 (smallest 8bit signed int)"
19935
feb65418c896 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19413
diff changeset
    66
feb65418c896 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19413
diff changeset
    67
    ^ -128
feb65418c896 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19413
diff changeset
    68
! !
feb65418c896 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 19413
diff changeset
    69
19176
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    70
!SignedByteArray methodsFor:'accessing'!
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    71
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    72
basicAt:index
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    73
    "return the indexed instance variable with index, anInteger
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    74
     - redefined here to return a signed interger."
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    75
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    76
%{  /* NOCONTEXT */
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    77
23102
574962856f04 Issue #200: fixed `#basicAt:` / `#basicAt:put:` to work with objects bigger than 2GB
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19941
diff changeset
    78
    REGISTER INT indx;
19176
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    79
    REGISTER OBJ slf;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    80
    REGISTER OBJ cls;
23102
574962856f04 Issue #200: fixed `#basicAt:` / `#basicAt:put:` to work with objects bigger than 2GB
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19941
diff changeset
    81
    REGISTER INT nIndex;
19176
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    82
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    83
    if (__isSmallInteger(index)) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    84
        indx = __intVal(index) - 1;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    85
        slf = self;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    86
        if ((cls = __qClass(slf)) != @global(SignedByteArray)) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    87
            if (((INT)__ClassInstPtr(cls)->c_flags & __MASKSMALLINT(ARRAYMASK))
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    88
                != __MASKSMALLINT(BYTEARRAY)) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    89
                goto fail;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    90
            }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    91
            if (indx < 0) goto fail;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    92
            indx += __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    93
        }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    94
        nIndex = __byteArraySize(slf);
23102
574962856f04 Issue #200: fixed `#basicAt:` / `#basicAt:put:` to work with objects bigger than 2GB
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19941
diff changeset
    95
        if ((unsigned INT)indx < (unsigned INT)nIndex) {
19176
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    96
            int byte = ((signed char *)__ByteArrayInstPtr(slf)->ba_element)[indx];
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    97
            RETURN ( __mkSmallInteger(byte));
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    98
        }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    99
    }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   100
  fail: ;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   101
%}.
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   102
    ^ super basicAt:index
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   103
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   104
    "
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   105
        #[0 1 2 3 127 128 254 255] copy changeClassTo:self
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   106
    "
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   107
!
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   108
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   109
basicAt:index put:value
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   110
    "set the indexed instance variable with index, anInteger to value.
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   111
     Returns value (sigh).
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   112
     - redefined here to allow value to be a signed integer"
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   113
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   114
%{  /* NOCONTEXT */
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   115
23102
574962856f04 Issue #200: fixed `#basicAt:` / `#basicAt:put:` to work with objects bigger than 2GB
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19941
diff changeset
   116
    REGISTER INT indx;
574962856f04 Issue #200: fixed `#basicAt:` / `#basicAt:put:` to work with objects bigger than 2GB
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19941
diff changeset
   117
    unsigned INT nIndex;
19176
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   118
    int val;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   119
    REGISTER OBJ slf;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   120
    REGISTER OBJ cls;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   121
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   122
    if (__bothSmallInteger(index, value)) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   123
        val = __intVal(value);
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   124
        if ((val >= -128) && (val <= 127)) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   125
            indx = __intVal(index) - 1;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   126
            slf = self;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   127
            if ((cls = __qClass(slf)) != @global(SignedByteArray)) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   128
                if (((INT)__ClassInstPtr(cls)->c_flags & __MASKSMALLINT(ARRAYMASK))
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   129
                    != __MASKSMALLINT(BYTEARRAY)) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   130
                    goto fail;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   131
                }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   132
                if (indx < 0) goto fail;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   133
                indx += __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   134
            }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   135
            nIndex = __byteArraySize(slf);
23102
574962856f04 Issue #200: fixed `#basicAt:` / `#basicAt:put:` to work with objects bigger than 2GB
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19941
diff changeset
   136
            if ((unsigned INT)indx < (unsigned INT)nIndex) {
19176
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   137
                __ByteArrayInstPtr(slf)->ba_element[indx] = val;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   138
                RETURN ( value );
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   139
            }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   140
        }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   141
    }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   142
  fail: ;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   143
%}.
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   144
    ^ super basicAt:index put:value
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   145
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   146
    "
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   147
       (self new:5) basicAt:1 put:-1; yourself
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   148
    "
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   149
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   150
    "Modified: 19.4.1996 / 11:14:40 / cg"
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   151
! !
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   152
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   153
!SignedByteArray methodsFor:'converting'!
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   154
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   155
asSignedByteArray
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   156
    ^ self.
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   157
!
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   158
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   159
asUnsignedByteArray
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   160
    "Answer a unsigned byte array.
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   161
     elements < 0 are converted to positive numbers."
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   162
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   163
    self class == SignedByteArray ifTrue:[
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   164
        self copy changeClassTo:ByteArray.
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   165
    ] ifFalse:[
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   166
        self shouldNotImplement.
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   167
    ].
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   168
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   169
    "
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   170
        #(-1 -128 3 4) asSignedByteArray asUnsignedByteArray
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   171
    "
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   172
!
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   173
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   174
beSigned
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   175
    "that's what I am"
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   176
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   177
    ^ self.
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   178
!
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   179
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   180
beUnsigned
19413
2337a2d9861c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 19176
diff changeset
   181
    "make myself unsigned.
19176
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   182
     elements < 0 are converted to positive numbers."
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   183
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   184
    self class == SignedByteArray ifTrue:[
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   185
        self changeClassTo:ByteArray.
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   186
    ] ifFalse:[
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   187
        self shouldNotImplement.
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   188
    ].
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   189
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   190
    "
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   191
        #(-1 -128 3 4) asSignedByteArray beUnsigned
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   192
    "
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   193
! !
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   194
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   195
!SignedByteArray methodsFor:'filling & replacing'!
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   196
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   197
from:start to:stop put:aNumber
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   198
    "fill part of the receiver with aNumber.
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   199
     - reimplemented here for speed"
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   200
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   201
%{  /* NOCONTEXT */
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   202
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   203
    REGISTER unsigned char *dstp;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   204
    REGISTER int count, value;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   205
    int len, index1, index2;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   206
    OBJ cls;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   207
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   208
    if (__isSmallInteger(aNumber)
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   209
     && __bothSmallInteger(start, stop)
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   210
     && __isBytes(self)) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   211
        len = __byteArraySize(self);
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   212
        index1 = __intVal(start);
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   213
        index2 = __intVal(stop);
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   214
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   215
        dstp = __ByteArrayInstPtr(self)->ba_element + index1 - 1;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   216
        if ((cls = __qClass(self)) != @global(SignedByteArray)) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   217
            int nInst;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   218
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   219
            nInst = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   220
            dstp += nInst;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   221
            len -= nInst;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   222
        }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   223
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   224
        value = __intVal(aNumber);
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   225
        if ((value >= -128) && (value <= 127)
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   226
         && (index1 <= index2)
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   227
         && (index1 > 0)) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   228
            if (index2 <= len) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   229
                count = index2 - index1 + 1;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   230
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   231
#ifdef memset4
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   232
                if (count > 20) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   233
                    /* fill unaligned part */
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   234
                    while (((unsigned INT)dstp & 3) != 0) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   235
                        *dstp++ = (unsigned char)value;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   236
                        count--;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   237
                    }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   238
                    /* fill aligned part */
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   239
                    {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   240
                        unsigned int n4 = count & ~3;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   241
                        unsigned int v4, nW;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   242
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   243
                        v4 = ((unsigned char)value << 8) | (unsigned char)value;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   244
                        v4 = (v4 << 16) | v4;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   245
                        nW = n4>>2;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   246
                        memset4(dstp, v4, nW);
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   247
                        count -= n4;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   248
                        dstp += n4;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   249
                    }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   250
                    while (count--) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   251
                        *dstp++ = (unsigned char)value;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   252
                    }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   253
                    RETURN (self);
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   254
                }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   255
#endif /* memset4 */
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   256
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   257
#if (__POINTER_SIZE__ == 8)
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   258
                {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   259
                    unsigned INT v8;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   260
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   261
                    v8 = ((unsigned char)value << 8) | (unsigned char)value;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   262
                    v8 = (v8 << 16) | v8;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   263
                    v8 = (v8 << 32) | v8;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   264
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   265
                    /* fill unaligned part */
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   266
                    while ((count > 0) && (((unsigned INT)dstp & 3) != 0)) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   267
                        *dstp++ = (unsigned char)value;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   268
                        count--;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   269
                    }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   270
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   271
                    if ((count >= 4) && (((unsigned INT)dstp & 7) != 0)) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   272
                        ((unsigned int *)dstp)[0] = v8;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   273
                        dstp += 4;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   274
                        count -= 4;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   275
                    }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   276
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   277
                    /* fill aligned part */
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   278
                    while (count >= 8) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   279
                        ((unsigned INT *)dstp)[0] = v8;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   280
                        dstp += 8;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   281
                        count -= 8;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   282
                    }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   283
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   284
                    /* fill rest */
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   285
                    if (count >= 4) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   286
                        ((unsigned int *)dstp)[0] = v8;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   287
                        dstp += 4;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   288
                        count -= 4;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   289
                    }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   290
                    if (count >= 2) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   291
                        ((unsigned short *)dstp)[0] = v8;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   292
                        dstp += 2;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   293
                        count -= 2;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   294
                    }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   295
                    if (count) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   296
                        *dstp = (unsigned char)value;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   297
                    }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   298
                    RETURN (self);
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   299
                }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   300
#endif /* 64bit */
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   301
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   302
#ifdef FAST_MEMSET
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   303
                memset(dstp, value, count);
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   304
#else
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   305
# ifdef __UNROLL_LOOPS__
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   306
                while (count >= 8) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   307
                    dstp[0] = dstp[1] = dstp[2] = dstp[3] =
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   308
                    dstp[4] = dstp[5] = dstp[6] = dstp[7] = (unsigned char)value;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   309
                    dstp += 8;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   310
                    count -= 8;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   311
                }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   312
# endif /* __UNROLL_LOOPS__ */
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   313
                while (count--) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   314
                    *dstp++ = (unsigned char)value;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   315
                }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   316
#endif
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   317
                RETURN (self);
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   318
            }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   319
        }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   320
    }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   321
%}.
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   322
    "
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   323
     fall back in case of non-integer index or out-of-bound index/value;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   324
     will eventually lead to an out-of-bound signal raise
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   325
    "
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   326
    ^ super from:start to:stop put:aNumber
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   327
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   328
    "
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   329
     (self new:10) from:1 to:10 put:-5
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   330
     (self new:20) from:10 to:20 put:-5
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   331
     (self new:20) from:1 to:10 put:-5
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   332
    "
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   333
! !
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   334
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   335
!SignedByteArray methodsFor:'queries'!
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   336
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   337
max
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   338
    "return the maximum value in the receiver -
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   339
     redefined to speedup image processing and sound-player
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   340
     (which need a fast method for this on byteArrays)"
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   341
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   342
%{  /* NOCONTEXT */
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   343
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   344
    signed char *cp;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   345
    int index, max, len;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   346
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   347
    if (__qClass(self) == @global(SignedByteArray)) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   348
        max = -128;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   349
        index = 0;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   350
        len = __qSize(self) - OHDR_SIZE;
19413
2337a2d9861c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 19176
diff changeset
   351
        if (len > 0) {
2337a2d9861c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 19176
diff changeset
   352
            for (cp = __ByteArrayInstPtr(self)->ba_element; ++index <= len; cp++) {
2337a2d9861c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 19176
diff changeset
   353
                int byte = *cp;
19176
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   354
19413
2337a2d9861c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 19176
diff changeset
   355
                if (byte > max) {
2337a2d9861c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 19176
diff changeset
   356
                    max = byte;
2337a2d9861c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 19176
diff changeset
   357
                    if (byte == 127) break;
2337a2d9861c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 19176
diff changeset
   358
                }
19176
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   359
            }
19413
2337a2d9861c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 19176
diff changeset
   360
            RETURN ( __mkSmallInteger(max) );
19176
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   361
        }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   362
    }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   363
%}.
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   364
    ^ super max
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   365
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   366
    "
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   367
     #[1 2 3 -11 2 3 1 2 19] max
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   368
     #(-1 -2 -3 -4) asSignedByteArray max
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   369
     #() asSignedByteArray max
19413
2337a2d9861c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 19176
diff changeset
   370
     #[] max   
2337a2d9861c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 19176
diff changeset
   371
     #() max   
19176
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   372
    "
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   373
! !
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   374
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   375
!SignedByteArray methodsFor:'searching'!
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   376
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   377
indexOf:aByte startingAt:start
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   378
    "return the index of the first occurrence of the argument, aByte
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   379
     in the receiver starting at start, anInteger; return 0 if not found.
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   380
     - reimplemented here for speed"
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   381
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   382
%{  /* NOCONTEXT */
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   383
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   384
    char *cp;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   385
    INT index;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   386
    int len;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   387
    OBJ cls;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   388
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   389
    if (__isSmallInteger(aByte) &&__isBytes(self)) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   390
        int byteValue = __intVal(aByte);
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   391
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   392
        if ((byteValue < -128) || (byteValue > 127)) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   393
            /*
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   394
             * searching for something which cannot be found
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   395
             */
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   396
            RETURN ( __mkSmallInteger(0) );
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   397
        }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   398
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   399
        if (__isSmallInteger(start)) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   400
            index = __intVal(start);
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   401
            len = __byteArraySize(self);
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   402
            cp = __ByteArrayInstPtr(self)->ba_element;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   403
            if ((cls = __qClass(self)) != @global(SignedByteArray)) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   404
                int nInst = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   405
                cp += nInst;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   406
                len -= nInst;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   407
            }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   408
            cp += index - 1;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   409
#ifdef __UNROLL_LOOPS__
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   410
            while ((index+4) < len) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   411
                if (cp[0] == byteValue) { RETURN ( __mkSmallInteger(index) ); }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   412
                if (cp[1] == byteValue) { RETURN ( __mkSmallInteger(index+1) ); }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   413
                if (cp[2] == byteValue) { RETURN ( __mkSmallInteger(index+2) ); }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   414
                if (cp[3] == byteValue) { RETURN ( __mkSmallInteger(index+3) ); }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   415
                index += 4;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   416
                cp += 4;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   417
            }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   418
#endif
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   419
            while (index <= len) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   420
                if (*cp == byteValue) {
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   421
                    RETURN ( __mkSmallInteger(index) );
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   422
                }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   423
                index++;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   424
                cp++;
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   425
            }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   426
            RETURN ( __mkSmallInteger(0) );
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   427
        }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   428
    }
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   429
%}.
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   430
    ^ super indexOf:aByte startingAt:start
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   431
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   432
    "
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   433
     #(-1 2 3 -4 5 6 7 8 9 0 1 2 3 4 5) asSignedByteArray indexOf:0 startingAt:1
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   434
     #(-1 2 3 -4 5 6 7 8 9 0 1 2 3 4 5) asSignedByteArray indexOf:-4 startingAt:1
19413
2337a2d9861c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 19176
diff changeset
   435
     #() asSignedByteArray indexOf:-4 startingAt:1  
2337a2d9861c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 19176
diff changeset
   436
     #() indexOf:-4 startingAt:1     
19176
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   437
    "
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   438
! !
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   439
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   440
!SignedByteArray class methodsFor:'documentation'!
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   441
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   442
version
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   443
    ^ '$Header$'
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   444
!
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   445
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   446
version_CVS
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   447
    ^ '$Header$'
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   448
! !
7c7f2efe0f72 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   449