/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.vxquery.types;

public class BuiltinTypeConstants {
    public static final int XS_ANY_TYPE_ID = 0;
    public static final int XS_ANY_SIMPLE_TYPE_ID = 1;
    public static final int XS_UNTYPED_TYPE_ID = 2;

    public static final int XS_ANY_ATOMIC_TYPE_ID = 3;
    public static final int XS_STRING_TYPE_ID = 4;
    public static final int XS_NORMALIZED_STRING_TYPE_ID = 5;
    public static final int XS_TOKEN_TYPE_ID = 6;
    public static final int XS_LANGUAGE_TYPE_ID = 7;
    public static final int XS_NMTOKEN_TYPE_ID = 8;
    public static final int XS_NAME_TYPE_ID = 9;
    public static final int XS_NCNAME_TYPE_ID = 10;
    public static final int XS_ID_TYPE_ID = 11;
    public static final int XS_IDREF_TYPE_ID = 12;
    public static final int XS_ENTITY_TYPE_ID = 13;
    public static final int XS_UNTYPED_ATOMIC_TYPE_ID = 14;
    public static final int XS_DATETIME_TYPE_ID = 15;
    public static final int XS_DATE_TYPE_ID = 16;
    public static final int XS_TIME_TYPE_ID = 17;
    public static final int XS_DURATION_TYPE_ID = 18;
    public static final int XS_YEAR_MONTH_DURATION_TYPE_ID = 19;
    public static final int XS_DAY_TIME_DURATION_TYPE_ID = 20;
    public static final int XSEXT_NUMERIC_TYPE_ID = 21;
    public static final int XS_FLOAT_TYPE_ID = 22;
    public static final int XS_DOUBLE_TYPE_ID = 23;
    public static final int XS_DECIMAL_TYPE_ID = 24;
    public static final int XS_INTEGER_TYPE_ID = 25;
    public static final int XS_NON_POSITIVE_INTEGER_TYPE_ID = 26;
    public static final int XS_NEGATIVE_INTEGER_TYPE_ID = 27;
    public static final int XS_LONG_TYPE_ID = 28;
    public static final int XS_INT_TYPE_ID = 29;
    public static final int XS_SHORT_TYPE_ID = 30;
    public static final int XS_BYTE_TYPE_ID = 31;
    public static final int XS_NON_NEGATIVE_INTEGER_TYPE_ID = 32;
    public static final int XS_UNSIGNED_LONG_TYPE_ID = 33;
    public static final int XS_UNSIGNED_INT_TYPE_ID = 34;
    public static final int XS_UNSIGNED_SHORT_TYPE_ID = 35;
    public static final int XS_UNSIGNED_BYTE_TYPE_ID = 36;
    public static final int XS_POSITIVE_INTEGER_TYPE_ID = 37;
    public static final int XS_G_YEAR_MONTH_TYPE_ID = 38;
    public static final int XS_G_YEAR_TYPE_ID = 39;
    public static final int XS_G_MONTH_DAY_TYPE_ID = 40;
    public static final int XS_G_DAY_TYPE_ID = 41;
    public static final int XS_G_MONTH_TYPE_ID = 42;
    public static final int XS_BOOLEAN_TYPE_ID = 43;
    public static final int XS_BASE64_BINARY_TYPE_ID = 44;
    public static final int XS_HEX_BINARY_TYPE_ID = 45;
    public static final int XS_ANY_URI_TYPE_ID = 46;
    public static final int XS_QNAME_TYPE_ID = 47;
    public static final int XS_NOTATION_TYPE_ID = 48;

    public static final int XS_IDREFS_TYPE_ID = 49;
    public static final int XS_NMTOKENS_TYPE_ID = 50;
    public static final int XS_ENTITIES_TYPE_ID = 51;

    public static final int BUILTIN_TYPE_COUNT = 52;
}
