/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * 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 android.hardware.tests.expression@1.0;

import IExpression;

interface IExpressionExt {

    enum NewEnum : int32_t {
        ENUM_GOOD = Constants:CONST_BAR,
        ENUM_BETTER = IExpression.Constants:CONST_BAR,
        ENUM_BEST = android.hardware.tests.expression@1.0::IExpression.Constants:CONST_BAR,
    };

    typedef Constants AlsoConstants;

    typedef Color[((Constants:MAX_ARRAY_SIZE << 1) - (AlsoConstants:CONST_FOO + 1)*8) >> 1] SixteenColors;
    struct ArrayOfColors {
        Color[(Constants:MAX_ARRAY_SIZE << 1) - (Constants:CONST_FOO + 1)*8] my32Colors; // 32
    };
    struct AnotherArrayOfColors {
        SixteenColors my16Colors;
    };

    foo3(int32_t[IExpression.Constants:MAX_ARRAY_SIZE] array);
    foo2(SixteenColors array);
    foo1(int32_t[Constants:CONST_FOO + 5] array);
};
