com.bugvm.apple.foundation.NSArray Maven / Gradle / Ivy
The newest version!
/*
* Copyright (C) 2013-2015 RoboVM AB
*
* 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.bugvm.apple.foundation;
/**/
import java.io.*;
import java.nio.*;
import java.util.*;
import com.bugvm.objc.*;
import com.bugvm.objc.annotation.*;
import com.bugvm.objc.block.*;
import com.bugvm.rt.*;
import com.bugvm.rt.annotation.*;
import com.bugvm.rt.bro.*;
import com.bugvm.rt.bro.annotation.*;
import com.bugvm.rt.bro.ptr.*;
import com.bugvm.apple.corefoundation.*;
import com.bugvm.apple.uikit.*;
import com.bugvm.apple.coretext.*;
import com.bugvm.apple.coreanimation.*;
import com.bugvm.apple.coredata.*;
import com.bugvm.apple.coregraphics.*;
import com.bugvm.apple.coremedia.*;
import com.bugvm.apple.security.*;
import com.bugvm.apple.dispatch.*;
/* */
/**/
/* */
/**/@Library("Foundation") @NativeClass/* */
/**/public/* */ class /**/NSArray/* */
extends /**/NSObject/* */
/**/implements NSFastEnumeration, NSPropertyList, List/* */ {
public static class NSArrayPtr extends Ptr, NSArrayPtr> {}
public static class AsListMarshaler {
@MarshalsPointer
public static List toObject(Class cls, long handle, long flags) {
return (NSArray) NSObject.Marshaler.toObject(cls, handle, flags);
}
@SuppressWarnings("unchecked")
@MarshalsPointer
public static long toNative(List l, long flags) {
if (l == null) {
return 0L;
}
NSArray o = null;
if (l instanceof NSArray) {
o = (NSArray) l;
} else {
o = new NSArray((List) l);
}
return NSObject.Marshaler.toNative(o, flags);
}
}
public static class AsIntegerListMarshaler {
@SuppressWarnings("unchecked")
@MarshalsPointer
public static List toObject(Class cls, long handle, long flags) {
NSArray o = (NSArray) NSObject.Marshaler.toObject(cls, handle, flags);
if (o == null) {
return null;
}
List list = new ArrayList<>();
for (NSNumber n : o) {
list.add(n.intValue());
}
return list;
}
@MarshalsPointer
public static long toNative(List l, long flags) {
if (l == null) {
return 0L;
}
NSArray array = new NSMutableArray<>();
for (Integer i : l) {
array.add(NSNumber.valueOf(i));
}
return NSObject.Marshaler.toNative(array, flags);
}
}
public static class AsDoubleListMarshaler {
@SuppressWarnings("unchecked")
@MarshalsPointer
public static List toObject(Class cls, long handle, long flags) {
NSArray o = (NSArray) NSObject.Marshaler.toObject(cls, handle, flags);
if (o == null) {
return null;
}
List list = new ArrayList<>();
for (NSNumber n : o) {
list.add(n.doubleValue());
}
return list;
}
@MarshalsPointer
public static long toNative(List l, long flags) {
if (l == null) {
return 0L;
}
NSArray array = new NSMutableArray<>();
for (Double i : l) {
array.add(NSNumber.valueOf(i));
}
return NSObject.Marshaler.toNative(array, flags);
}
}
public static class AsStringListMarshaler {
@MarshalsPointer
public static List toObject(Class cls, long handle, long flags) {
NSArray o = (NSArray) NSObject.Marshaler.toObject(cls, handle, flags);
if (o == null) {
return null;
}
return o.asStringList();
}
@MarshalsPointer
public static long toNative(List l, long flags) {
if (l == null) {
return 0L;
}
return NSObject.Marshaler.toNative(NSArray.fromStrings(l), flags);
}
}
static class ListAdapter extends AbstractList {
protected final NSArray array;
ListAdapter(NSArray array) {
this.array = array;
}
@Override
public U get(int index) {
checkIndex(index);
return (U) array.getObjectAt(index);
}
protected void checkIndex(int index) {
int size = (int) array.getCount();
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("index = " + index + ", size = " + size);
}
}
@Override
public int size() {
return (int) array.getCount();
}
@Override
public boolean contains(Object o) {
if (o instanceof NSObject) {
return array.containsObject((NSObject) o);
}
return false;
}
@Override
public int indexOf(Object o) {
if (o instanceof NSObject) {
return (int) array.indexOfObject((NSObject) o);
}
return -1;
}
}
/**/static { ObjCRuntime.bind(NSArray.class); }/* */
/**//* */
private AbstractList adapter = createAdapter();
/**/
public NSArray() {}
protected NSArray(SkipInit skipInit) { super(skipInit); }
/* */
public NSArray(Collection c) {
super((SkipInit) null);
if (c == null) {
throw new NullPointerException("c");
}
if (c instanceof NSArray) {
initObject(init((NSArray) c));
} else {
ObjCObject[] objects = c.toArray(new ObjCObject[c.size()]);
initWithObjects(objects);
}
}
@SuppressWarnings("unchecked")
public NSArray(T ... objects) {
super((SkipInit) null);
if (objects == null) {
throw new NullPointerException("objects");
}
initWithObjects(objects);
}
/**/
@Property(selector = "count")
protected native @MachineSizedUInt long getCount();
/**
* @since Available in iOS 4.0 and later.
*/
@Property(selector = "firstObject")
public native T first();
@Property(selector = "lastObject")
public native T last();
@Property(selector = "sortedArrayHint")
public native NSData getSortedArrayHint();
/* */
/**//* */
protected static void checkNull(Object o) {
if (o == null) {
throw new NullPointerException("null values are not allowed in NSArray. Use NSNull instead.");
}
}
private void initWithObjects(ObjCObject[] objects) {
VoidPtr.VoidPtrPtr ptr = null;
if (objects.length > 0) {
ptr = Struct.allocate(VoidPtr.VoidPtrPtr.class, objects.length);
for (int i = 0; i < objects.length; i++) {
checkNull(objects[i]);
ptr.set(objects[i].getHandle());
ptr = ptr.next();
}
ptr = ptr.previous(objects.length);
}
initObject(init(ptr != null ? ptr.getHandle() : 0, objects.length));
}
protected AbstractList createAdapter() {
return new ListAdapter(this);
}
@Override
protected void afterMarshaled(int flags) {
if (adapter == null) {
adapter = createAdapter();
}
super.afterMarshaled(flags);
}
public void add(int index, T element) {
adapter.add(index, element);
}
public boolean add(T e) {
return adapter.add(e);
}
public boolean addAll(Collection c) {
return adapter.addAll(c);
}
public boolean addAll(int index, Collection c) {
return adapter.addAll(index, c);
}
public void clear() {
adapter.clear();
}
public boolean contains(Object o) {
return adapter.contains(o);
}
public boolean containsAll(Collection c) {
return adapter.containsAll(c);
}
public T get(int index) {
return adapter.get(index);
}
public int indexOf(Object o) {
return adapter.indexOf(o);
}
public boolean isEmpty() {
return adapter.isEmpty();
}
public Iterator iterator() {
return adapter.iterator();
}
public int lastIndexOf(Object o) {
return adapter.lastIndexOf(o);
}
public ListIterator listIterator() {
return adapter.listIterator();
}
public ListIterator listIterator(int index) {
return adapter.listIterator(index);
}
public T remove(int index) {
return adapter.remove(index);
}
public boolean remove(Object o) {
return adapter.remove(o);
}
public boolean removeAll(Collection c) {
return adapter.removeAll(c);
}
public boolean retainAll(Collection c) {
return adapter.retainAll(c);
}
public T set(int index, T element) {
return adapter.set(index, element);
}
public int size() {
return adapter.size();
}
public NSArray subList(int start, int end) {
if (start >= 0 && end <= size()) {
if (start <= end) {
return (NSArray) getSubarray(new NSRange(start, end - start));
}
throw new IllegalArgumentException();
}
throw new IndexOutOfBoundsException();
}
public Object[] toArray() {
return adapter.toArray();
}
public U[] toArray(U[] a) {
return adapter.toArray(a);
}
public static NSArray read(java.io.File file) {
return readFile(file.getAbsolutePath());
}
public void write(java.io.File file, boolean atomically) {
writeFile(file.getAbsolutePath(), atomically);
}
/**
* Use this method to convert a NSArray of NSString items to a List of String items.
* Elements of this NSArray must be of type NSString, otherwise an exception will be thrown.
* @return
* @throws UnsupportedOperationException when the array items are not of type NSString.
*/
public List asStringList() {
List list = new ArrayList<>();
if (size() == 0)
return list;
if (!(get(0) instanceof NSString))
throw new UnsupportedOperationException("items must be of type NSString");
for (T str : this) {
list.add(str.toString());
}
return list;
}
public static NSArray fromStrings (String... strings) {
int length = strings.length;
NSString[] nsStrings = new NSString[length];
for (int i = 0; i < length; i++) {
nsStrings[i] = new NSString(strings[i]);
}
return new NSArray(nsStrings);
}
public static NSArray fromStrings (Collection strings) {
NSString[] nsStrings = new NSString[strings.size()];
int i = 0;
for (String s : strings) {
nsStrings[i] = new NSString(s);
i++;
}
return new NSArray(nsStrings);
}
public static NSArray fromNumbers (Number...numbers) {
int length = numbers.length;
NSNumber[] nsNumbers = new NSNumber[length];
for (int i = 0; i < length; i++) {
nsNumbers[i] = NSNumber.valueOf(numbers[i]);
}
return new NSArray(nsNumbers);
}
public static NSArray fromNumbers (Collection numbers) {
NSNumber[] nsNumbers = new NSNumber[numbers.size()];
int i = 0;
for (Number n : numbers) {
nsNumbers[i] = NSNumber.valueOf(n);
i++;
}
return new NSArray(nsNumbers);
}
/**/
@Method(selector = "objectAtIndex:")
protected native T getObjectAt(@MachineSizedUInt long index);
@Method(selector = "initWithObjects:count:")
protected native @Pointer long init(@Pointer long objects, @MachineSizedUInt long cnt);
@Method(selector = "containsObject:")
protected native boolean containsObject(NSObject anObject);
@Method(selector = "indexOfObject:")
protected native @MachineSizedUInt long indexOfObject(NSObject anObject);
@Method(selector = "subarrayWithRange:")
protected native NSArray getSubarray(@ByVal NSRange range);
@Method(selector = "writeToFile:atomically:")
protected native boolean writeFile(String path, boolean atomically);
@Method(selector = "writeToURL:atomically:")
public native boolean write(NSURL url, boolean atomically);
@Method(selector = "initWithArray:")
protected native @Pointer long init(NSArray array);
@Method(selector = "arrayWithContentsOfFile:")
protected static native NSArray readFile(String path);
@Method(selector = "arrayWithContentsOfURL:")
public static native NSArray read(NSURL url);
@Method(selector = "addObserver:toObjectsAtIndexes:forKeyPath:options:context:")
public native void addObserver(NSObject observer, NSIndexSet indexes, String keyPath, NSKeyValueObservingOptions options, VoidPtr context);
/**
* @since Available in iOS 5.0 and later.
*/
@Method(selector = "removeObserver:fromObjectsAtIndexes:forKeyPath:context:")
public native void removeObserver(NSObject observer, NSIndexSet indexes, String keyPath, VoidPtr context);
/* */
}