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