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