.. 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.

.. _api.types:
.. currentmodule:: pyarrow

Data Types and Schemas
======================

Factory Functions
-----------------

These should be used to create Arrow data types and schemas.

.. autosummary::
   :toctree: ../generated/

   null
   bool_
   int8
   int16
   int32
   int64
   uint8
   uint16
   uint32
   uint64
   float16
   float32
   float64
   time32
   time64
   timestamp
   date32
   date64
   binary
   string
   utf8
   large_binary
   large_string
   large_utf8
   decimal128
   list_
   large_list
   map_
   struct
   dictionary
   field
   schema
   from_numpy_dtype

.. _api.type_classes:
.. currentmodule:: pyarrow

Type Classes
------------

Do not instantiate these classes directly.  Instead, call one of the factory
functions above.

.. autosummary::
   :toctree: ../generated/

   DataType
   DictionaryType
   ListType
   MapType
   StructType
   UnionType
   TimestampType
   Time32Type
   Time64Type
   FixedSizeBinaryType
   Decimal128Type
   Field
   Schema

Specific classes and functions for extension types.

.. autosummary::
   :toctree: ../generated/

   ExtensionType
   PyExtensionType
   register_extension_type
   unregister_extension_type


.. _api.types.checking:
.. currentmodule:: pyarrow.types

Type Checking
-------------

These functions are predicates to check whether a :class:`DataType` instance
represents a given data type (such as ``int32``) or general category
(such as "is a signed integer").

.. autosummary::
   :toctree: ../generated/

   is_boolean
   is_integer
   is_signed_integer
   is_unsigned_integer
   is_int8
   is_int16
   is_int32
   is_int64
   is_uint8
   is_uint16
   is_uint32
   is_uint64
   is_floating
   is_float16
   is_float32
   is_float64
   is_decimal
   is_list
   is_large_list
   is_struct
   is_union
   is_nested
   is_temporal
   is_timestamp
   is_date
   is_date32
   is_date64
   is_time
   is_time32
   is_time64
   is_null
   is_binary
   is_unicode
   is_string
   is_large_binary
   is_large_unicode
   is_large_string
   is_fixed_size_binary
   is_map
   is_dictionary
