12f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla/*
22f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla * Copyright (C) 2017 The Android Open Source Project
32f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla *
42f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla * Licensed under the Apache License, Version 2.0 (the "License");
52f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla * you may not use this file except in compliance with the License.
62f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla * You may obtain a copy of the License at
72f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla *
82f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla *      http://www.apache.org/licenses/LICENSE-2.0
92f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla *
102f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla * Unless required by applicable law or agreed to in writing, software
112f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla * distributed under the License is distributed on an "AS IS" BASIS,
122f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla * See the License for the specific language governing permissions and
142f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla * limitations under the License.
152f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla */
162f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla
172f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Suslapackage com.android.internal.util.function.pooled;
182f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla
192f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Suslaimport com.android.internal.util.FunctionalUtils.ThrowingRunnable;
202f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Suslaimport com.android.internal.util.FunctionalUtils.ThrowingSupplier;
212d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganovimport com.android.internal.util.function.HexConsumer;
222d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganovimport com.android.internal.util.function.HexFunction;
232f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Suslaimport com.android.internal.util.function.QuadConsumer;
242f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Suslaimport com.android.internal.util.function.QuadFunction;
252d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganovimport com.android.internal.util.function.QuintConsumer;
262d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganovimport com.android.internal.util.function.QuintFunction;
272f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Suslaimport com.android.internal.util.function.TriConsumer;
282f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Suslaimport com.android.internal.util.function.TriFunction;
292f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla
302f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Suslaimport java.util.function.BiConsumer;
312f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Suslaimport java.util.function.BiFunction;
322f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Suslaimport java.util.function.BiPredicate;
332f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Suslaimport java.util.function.Function;
342f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla
352f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla/**
362f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla * An interface implementing all supported function interfaces, delegating each to {@link #invoke}
372f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla *
382f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla * @hide
392f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla */
402d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganovabstract class OmniFunction<A, B, C, D, E, F, R> implements
412f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla        PooledFunction<A, R>, BiFunction<A, B, R>, TriFunction<A, B, C, R>,
422d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov        QuadFunction<A, B, C, D, R>, QuintFunction<A, B, C, D, E, R>,
432d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov        HexFunction<A, B, C, D, E, F, R>, PooledConsumer<A>, BiConsumer<A, B>,
442d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov        TriConsumer<A, B, C>, QuadConsumer<A, B, C, D>, QuintConsumer<A, B, C, D, E>,
452d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov        HexConsumer<A, B, C, D, E, F>, PooledPredicate<A>, BiPredicate<A, B>,
462d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov        PooledSupplier<R>, PooledRunnable, ThrowingRunnable, ThrowingSupplier<R>,
472f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla        PooledSupplier.OfInt, PooledSupplier.OfLong, PooledSupplier.OfDouble {
482f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla
492d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov    abstract R invoke(A a, B b, C c, D d, E e, F f);
502f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla
512f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    @Override
522f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    public R apply(A o, B o2) {
532d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov        return invoke(o, o2, null, null, null, null);
542f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    }
552f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla
562f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    @Override
572f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    public R apply(A o) {
582d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov        return invoke(o, null, null, null, null, null);
592f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    }
602f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla
612d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov    abstract public <V> OmniFunction<A, B, C, D, E, F, V> andThen(
622d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov            Function<? super R, ? extends V> after);
632d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov    abstract public OmniFunction<A, B, C, D, E, F, R> negate();
642f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla
652f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    @Override
662f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    public void accept(A o, B o2) {
672d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov        invoke(o, o2, null, null, null, null);
682f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    }
692f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla
702f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    @Override
712f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    public void accept(A o) {
722d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov        invoke(o, null, null, null, null, null);
732f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    }
742f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla
752f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    @Override
762f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    public void run() {
772d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov        invoke(null, null, null, null, null, null);
782f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    }
792f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla
802f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    @Override
812f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    public R get() {
822d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov        return invoke(null, null, null, null, null, null);
832f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    }
842f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla
852f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    @Override
862f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    public boolean test(A o, B o2) {
872d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov        return (Boolean) invoke(o, o2, null, null, null, null);
882f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    }
892f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla
902f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    @Override
912f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    public boolean test(A o) {
922d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov        return (Boolean) invoke(o, null, null, null, null, null);
932f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    }
942f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla
952f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    @Override
962f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    public PooledRunnable asRunnable() {
972f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla        return this;
982f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    }
992f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla
1002f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    @Override
1012f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    public PooledConsumer<A> asConsumer() {
1022f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla        return this;
1032f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    }
1042f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla
1052f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    @Override
1062f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    public R apply(A a, B b, C c) {
1072d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov        return invoke(a, b, c, null, null, null);
1082f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    }
1092f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla
1102f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    @Override
1112f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    public void accept(A a, B b, C c) {
1122d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov        invoke(a, b, c, null, null, null);
1132f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    }
1142f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla
1152f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    @Override
1162f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    public R apply(A a, B b, C c, D d) {
1172d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov        return invoke(a, b, c, d, null, null);
1182d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov    }
1192d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov
1202d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov    @Override
1212d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov    public R apply(A a, B b, C c, D d, E e) {
1222d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov        return invoke(a, b, c, d, e, null);
1232d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov    }
1242d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov
1252d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov    @Override
1262d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov    public R apply(A a, B b, C c, D d, E e, F f) {
1272d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov        return invoke(a, b, c, d, e, f);
1282f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    }
1292f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla
1302f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    @Override
1312f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    public void accept(A a, B b, C c, D d) {
1322d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov        invoke(a, b, c, d, null, null);
1332d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov    }
1342d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov
1352d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov    @Override
1362d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov    public void accept(A a, B b, C c, D d, E e) {
1372d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov        invoke(a, b, c, d, e, null);
1382d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov    }
1392d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov
1402d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov    @Override
1412d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov    public void accept(A a, B b, C c, D d, E e, F f) {
1422d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov        invoke(a, b, c, d, e, f);
1432f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    }
1442f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla
1452f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    @Override
1462f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    public void runOrThrow() throws Exception {
1472f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla        run();
1482f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    }
1492f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla
1502f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    @Override
1512f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    public R getOrThrow() throws Exception {
1522f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla        return get();
1532f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    }
1542f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla
1552f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla    @Override
1562d20fb47f4a7162450f993728876c74762b93112Svetoslav Ganov    abstract public OmniFunction<A, B, C, D, E, F, R> recycleOnUse();
1572f5ee71ec851b1149b4e10ec211ad520cd73776eEugene Susla}
158