// Path: library/src/main/java/ru/noties/storm/util/ImmutableInt.java
// public class ImmutableInt {
// 
//     public static ImmutableInt newInstance(int value) {
//         return new ImmutableInt(value);
//     }
// 
//     public static ImmutableInt newInstance(boolean isReusable) {
//         return new ImmutableInt(isReusable);
//     }
// 
//     private int mValue;
//     private final boolean mIsReusable;
// 
//     public ImmutableInt(int value) {
//         this(false);
//         this.mValue = value;
//     }
// 
//     ImmutableInt(boolean isReusable) {
//         this.mIsReusable = isReusable;
//     }
// 
//     public int getValue() {
//         return mValue;
//     }
// 
//     public void setValue(int value) {
//         if (!mIsReusable) {
//             throw new IllegalStateException("This instance of the ImmutableInt is not marked as reusable");
//         }
//         this.mValue = value;
//     }
// }
// 
// Path: library/src/main/java/ru/noties/storm/util/MapUtils.java
// public class MapUtils {
// 
//     private MapUtils() {}
// 
//     public static  <K, V> Map<K, V> create() {
//         if (Build.VERSION.SDK_INT >= 19) {
//             return create19();
//         }
//         return createOther();
//     }
// 
//     @TargetApi(19)
//     private static <K, V> Map<K, V> create19() {
//         return new ArrayMap<>();
//     }
// 
//     private static <K, V> Map<K, V> createOther() {
//         return new HashMap<>();
//     }
// }
// 
// Path: library/src/main/java/ru/noties/storm/vp/CursorGetterFieldSetter.java
// public class CursorGetterFieldSetter<T> implements CursorValueProvider<T>, FieldValueSetter<T> {
// 
//     private final CursorValueProvider<T>    getter;
//     private final FieldValueSetter<T>       setter;
// 
//     public CursorGetterFieldSetter(
//             CursorValueProvider<T> getter,
//             FieldValueSetter<T> setter
//     ) {
//         this.getter = getter;
//         this.setter = setter;
//     }
// 
//     @Override
//     public T get(Cursor cursor, int position) {
//         return getter.get(cursor, position);
//     }
// 
//     @Override
//     public void set(IField field, Object who, T value) throws IllegalAccessException {
//         setter.set(field, who, value);
//     }
// 
//     public void doYourThing(Cursor cursor, int position, IField field, Object who) {
//         final T value = get(cursor, position);
//         try {
//             set(field, who, value);
//         } catch (IllegalAccessException e) {
//             e.printStackTrace();
//         }
//     }
// }


import android.database.Cursor;
import android.support.annotation.Nullable;
import java.util.Map;
import ru.noties.storm.util.ImmutableInt;
import ru.noties.storm.util.MapUtils;
import ru.noties.storm.vp.CursorGetterFieldSetter;
import ru.noties.storm.vp.CursorValueProvider;
import ru.noties.storm.vp.FieldValueSetter;
    }

    @Override
    public T parse(Cursor cursor, @Nullable NameProvider nameProvider) {

        if (mIndices == null) {
            mIndices = getIndices(cursor);
        }

        final T object = mInstanceCreator.create(mClazz);

        CursorGetterFieldSetter<?> getterFieldSetter;

        for (FieldHolder holder: getCachedTable(mClazz).getFields()) {

            final int columnIndex = getColumnIndex(holder.getName());
            if (columnIndex < 0) {
                continue;
            }

            getterFieldSetter = getGetterAndSetter(holder.getType());
            getterFieldSetter.doYourThing(cursor, columnIndex, holder.getFieldDelegate(), object);
        }

        return object;
    }

    protected int getColumnIndex(String name) {
        final ImmutableInt immutableInt = mIndices.get(name);
        if (immutableInt == null) {
// Path: library/src/main/java/ru/noties/storm/util/ImmutableInt.java
// public class ImmutableInt {
// 
//     public static ImmutableInt newInstance(int value) {
//         return new ImmutableInt(value);
//     }
// 
//     public static ImmutableInt newInstance(boolean isReusable) {
//         return new ImmutableInt(isReusable);
//     }
// 
//     private int mValue;
//     private final boolean mIsReusable;
// 
//     public ImmutableInt(int value) {
//         this(false);
//         this.mValue = value;
//     }
// 
//     ImmutableInt(boolean isReusable) {
//         this.mIsReusable = isReusable;
//     }
// 
//     public int getValue() {
//         return mValue;
//     }
// 
//     public void setValue(int value) {
//         if (!mIsReusable) {
//             throw new IllegalStateException("This instance of the ImmutableInt is not marked as reusable");
//         }
//         this.mValue = value;
//     }
// }
// 
// Path: library/src/main/java/ru/noties/storm/util/MapUtils.java
// public class MapUtils {
// 
//     private MapUtils() {}
// 
//     public static  <K, V> Map<K, V> create() {
//         if (Build.VERSION.SDK_INT >= 19) {
//             return create19();
//         }
//         return createOther();
//     }
// 
//     @TargetApi(19)
//     private static <K, V> Map<K, V> create19() {
//         return new ArrayMap<>();
//     }
// 
//     private static <K, V> Map<K, V> createOther() {
//         return new HashMap<>();
//     }
// }
// 
// Path: library/src/main/java/ru/noties/storm/vp/CursorGetterFieldSetter.java
// public class CursorGetterFieldSetter<T> implements CursorValueProvider<T>, FieldValueSetter<T> {
// 
//     private final CursorValueProvider<T>    getter;
//     private final FieldValueSetter<T>       setter;
// 
//     public CursorGetterFieldSetter(
//             CursorValueProvider<T> getter,
//             FieldValueSetter<T> setter
//     ) {
//         this.getter = getter;
//         this.setter = setter;
//     }
// 
//     @Override
//     public T get(Cursor cursor, int position) {
//         return getter.get(cursor, position);
//     }
// 
//     @Override
//     public void set(IField field, Object who, T value) throws IllegalAccessException {
//         setter.set(field, who, value);
//     }
// 
//     public void doYourThing(Cursor cursor, int position, IField field, Object who) {
//         final T value = get(cursor, position);
//         try {
//             set(field, who, value);
//         } catch (IllegalAccessException e) {
//             e.printStackTrace();
//         }
//     }
// }


// Path: library/src/main/java/ru/noties/storm/AbsCursorParser.java
import android.database.Cursor;
import android.support.annotation.Nullable;
import java.util.Map;
import ru.noties.storm.util.ImmutableInt;
import ru.noties.storm.util.MapUtils;
import ru.noties.storm.vp.CursorGetterFieldSetter;
import ru.noties.storm.vp.CursorValueProvider;
import ru.noties.storm.vp.FieldValueSetter;

    }

    @Override
    public T parse(Cursor cursor, @Nullable NameProvider nameProvider) {

        if (mIndices == null) {
            mIndices = getIndices(cursor);
        }

        final T object = mInstanceCreator.create(mClazz);

        CursorGetterFieldSetter<?> getterFieldSetter;

        for (FieldHolder holder: getCachedTable(mClazz).getFields()) {

            final int columnIndex = getColumnIndex(holder.getName());
            if (columnIndex < 0) {
                continue;
            }

            getterFieldSetter = getGetterAndSetter(holder.getType());
            getterFieldSetter.doYourThing(cursor, columnIndex, holder.getFieldDelegate(), object);
        }

        return object;
    }

    protected int getColumnIndex(String name) {
        final ImmutableInt immutableInt = mIndices.get(name);
        if (immutableInt == null) {
            return -1;