package com.ctriposs.tsdb.storage; public class CodeBlock { private final CodeItem codes[]; private int curPos = 0; private int maxPos = -1; private int minCode = 0; private int maxCode = 0; public CodeBlock(byte[] bytes, int count) { this.maxPos = count - 1; this.codes = new CodeItem[count]; for(int i = 0; i < count; i++) { codes[i] = new CodeItem(bytes, i * CodeItem.CODE_ITEM_SIZE); if(i==0){ minCode = codes[i].getCode(); } maxCode = codes[i].getCode(); } } public boolean hasNext(){ return curPos <= maxPos; } public boolean hasPrev(){ return curPos >= 0; } public int containCode(int code){ if(code >= minCode && code <= maxCode){ return 0; }else if(code > maxCode){ return -1; }else{ return 1; } } public boolean seek(int code) { boolean result = false; int left = 0; int right = maxPos; curPos = -1; while (left <= right) { int mid = (left + right) / 2; if (code < codes[mid].getCode()) { right = mid - 1; } else if (code > codes[mid].getCode()) { left = mid + 1; } else { curPos = mid; break; } } if (curPos != -1) { result = true; } else { curPos = maxPos + 1; } return result; } public CodeItem current() { if (curPos <= maxPos && curPos >= 0) { return codes[curPos]; } return null; } public CodeItem last(){ curPos = maxPos; return codes[curPos]; } public CodeItem next() { if (curPos <= maxPos&&curPos >= 0) { return codes[curPos++]; } return null; } public CodeItem prev() { if (curPos <= maxPos && curPos >= 0) { return codes[curPos--]; } return null; } }