Initial version of Windows defender checker notification
[idea/community.git] / platform / core-impl / src / com / intellij / openapi / editor / ex / util / ShortBasedStorage.java
1 // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.openapi.editor.ex.util;
3
4 import com.intellij.psi.tree.IElementType;
5 import com.intellij.util.ArrayUtil;
6 import org.jetbrains.annotations.NotNull;
7
8 import static com.intellij.openapi.editor.ex.util.SegmentArray.INITIAL_SIZE;
9 import static com.intellij.openapi.editor.ex.util.SegmentArray.calcCapacity;
10
11 /**
12  * SegmentArrayWithData storage based on the short array. It allows to store one short per segment which is enough for storing
13  * {@link IElementType} index and and restartability of the state (positive values are for initial state).
14  */
15 public class ShortBasedStorage implements DataStorage {
16   short[] myData;
17
18   public ShortBasedStorage() {
19     myData = new short[INITIAL_SIZE];
20   }
21
22   private ShortBasedStorage(short[] data) {
23     myData = data;
24   }
25
26   @Override
27   public void setData(int segmentIndex, int data) {
28     if (segmentIndex >= myData.length) {
29       myData = ArrayUtil.realloc(myData, calcCapacity(myData.length, segmentIndex));
30     }
31     myData[segmentIndex] = (short)data;
32   }
33
34   @Override
35   public void remove(int startIndex, int endIndex, int mySegmentCount) {
36     if (endIndex < mySegmentCount) {
37       System.arraycopy(myData, endIndex, myData, startIndex, mySegmentCount - endIndex);
38     }
39   }
40
41   @Override
42   public void replace(DataStorage storage, int startOffset, int len) {
43     assert storage instanceof ShortBasedStorage;
44     System.arraycopy(((ShortBasedStorage)storage).myData, 0, myData, startOffset, len);
45   }
46
47   @Override
48   public void insert(DataStorage storageToInsert, int startIndex, int segmentCountToInsert, int segmentCount) {
49     assert storageToInsert instanceof ShortBasedStorage;
50     myData = insert(myData, ((ShortBasedStorage)storageToInsert).myData, startIndex, segmentCountToInsert, segmentCount);
51   }
52
53   @Override
54   public int getData(int index) {
55     return myData[index];
56   }
57
58   @Override
59   public int packData(IElementType tokenType, int state, boolean isRestartableState) {
60     final short idx = tokenType.getIndex();
61     return isRestartableState ? idx : -idx;
62   }
63
64   @Override
65   public int unpackStateFromData(int data) {
66     throw new UnsupportedOperationException("Unable to unpack state, state is not stored in ShortBasedStorage");
67   }
68
69   @Override
70   public IElementType unpackTokenFromData(int data) {
71     return IElementType.find((short)Math.abs(data));
72   }
73
74   @Override
75   public DataStorage copy() {
76     return new ShortBasedStorage(myData);
77   }
78
79   @Override
80   public DataStorage createStorage() {
81     return new ShortBasedStorage();
82   }
83
84   @NotNull
85   protected static short[] insert(@NotNull short[] array,
86                                   @NotNull short[] insertArray, int startIndex, int insertLength, int mySegmentCount) {
87     short[] newArray = reallocateArray(array, mySegmentCount + insertLength);
88     if (startIndex < mySegmentCount) {
89       System.arraycopy(newArray, startIndex, newArray, startIndex + insertLength, mySegmentCount - startIndex);
90     }
91     System.arraycopy(insertArray, 0, newArray, startIndex, insertLength);
92     return newArray;
93   }
94
95   @NotNull
96   protected static short[] reallocateArray(@NotNull short[] array, int index) {
97     if (index < array.length) return array;
98     return ArrayUtil.realloc(array, calcCapacity(array.length, index));
99   }
100 }