/* * Copyright (C) 2022 github.com/REAndroid * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.reandroid.arsc.group; import com.reandroid.arsc.base.Block; import com.reandroid.arsc.base.BlockArrayCreator; import java.util.AbstractList; import java.util.Iterator; import java.util.List; import java.util.Objects; public class ItemGroup { private final BlockArrayCreator mBlockArrayCreator; private final String name; private T[] items; public ItemGroup(BlockArrayCreator blockArrayCreator, String name){ this.mBlockArrayCreator=blockArrayCreator; this.name=name; this.items=blockArrayCreator.newInstance(0); } public Iterator iterator(){ return iterator(false); } public Iterator iterator(boolean skipNullBlock){ return new GroupIterator(skipNullBlock); } public List listItems(){ return new AbstractList() { private final int mSize = ItemGroup.this.size(); @Override public T get(int i) { return ItemGroup.this.get(i); } @Override public int size() { return mSize; } }; } public T get(int i){ if(i<0||i>= size()){ return null; } return items[i]; } public int size(){ if(items==null){ return 0; } return items.length; } public boolean contains(T block){ if(block==null){ return false; } int len=items.length; for(int i=0;i { private int mCursor; private final int mMaxSize; private final boolean mSkipNullBlock; GroupIterator(boolean skipNullBlock){ mSkipNullBlock=skipNullBlock; mCursor=0; mMaxSize=ItemGroup.this.size(); } @Override public boolean hasNext() { checkCursor(); return !isFinished(); } @Override public T next() { if(!isFinished()){ T item=ItemGroup.this.get(mCursor); mCursor++; checkCursor(); return item; } return null; } private boolean isFinished(){ return mCursor>=mMaxSize; } private void checkCursor(){ if(!mSkipNullBlock || isFinished()){ return; } T item=ItemGroup.this.get(mCursor); while (item==null||item.isNull()){ mCursor++; item=ItemGroup.this.get(mCursor); if(mCursor>=mMaxSize){ break; } } } } }