/*
 * Copyright 2010-2016 Intel Corporation.
 *
 * This library is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation, version 2.1.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301 USA.
 *
 * Disclaimer: The codes contained in these modules may be specific
 * to the Intel Software Development Platform codenamed Knights Ferry,
 * and the Intel product codenamed Knights Corner, and are not backward
 * compatible with other Intel products. Additionally, Intel will NOT
 * support the codes or instruction set in future products.
 *
 * Intel offers no warranty of any kind regarding the code. This code is
 * licensed on an "AS IS" basis and Intel is not obligated to provide
 * any support, assistance, installation, training, or other services
 * of any kind. Intel is also not obligated to provide any updates,
 * enhancements or extensions. Intel specifically disclaims any warranty
 * of merchantability, non-infringement, fitness for any particular
 * purpose, and any other warranty.
 *
 * Further, Intel disclaims all liability of any kind, including but
 * not limited to liability for infringement of any proprietary rights,
 * relating to the use of the code, even if Intel is notified of the
 * possibility of such liability. Except as expressly stated in an Intel
 * license agreement provided with this code and agreed upon with Intel,
 * no license, express or implied, by estoppel or otherwise, to any
 * intellectual property rights is granted herein.
 */

#ifndef _COITYPES_COMMON_H
#define _COITYPES_COMMON_H

/** @ingroup COITypes
 *  @addtogroup COITypesSource
@{

* @file common/COITypes_common.h
*/
#ifndef DOXYGEN_SHOULD_SKIP_THIS
        #include <stdint.h>
        #include <wchar.h>
        #define COIACCESSAPI /* nothing */
        #define COIACCESSAPI2 /* nothing */
#endif /* DOXYGEN_SHOULD_SKIP_THIS */


#ifdef __cplusplus
extern "C" {
#endif


struct coievent
{
    uint64_t opaque[2];
};

typedef struct coiprocess   *COIPROCESS;
typedef struct coipipeline *COIPIPELINE;
typedef struct coifunction *COIFUNCTION;
typedef struct coiengine    *COIENGINE;
typedef struct coievent      COIEVENT;
typedef struct coibuffer    *COIBUFFER;
typedef struct coilibrary   *COILIBRARY;
typedef struct coimapinst   *COIMAPINSTANCE;

typedef uint64_t COI_CPU_MASK[16];

/**
 * On Windows, coi_wchar_t is a uint32_t. On Windows, wchar_t is 16 bits wide, and on Linux it is 32 bits wide, so uint32_t is used for portability.
 */
typedef wchar_t  coi_wchar_t;

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* _COITYPES_COMMON_H */
