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