/*** Autogenerated by WIDL 11.0-rc1 from include/windows.perception.spatial.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __windows_perception_spatial_h__
#define __windows_perception_spatial_h__

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume;
#ifdef __cplusplus
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume ABI::Windows::Perception::Spatial::ISpatialBoundingVolume
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                interface ISpatialBoundingVolume;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics ABI::Windows::Perception::Spatial::ISpatialBoundingVolumeStatics
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                interface ISpatialBoundingVolumeStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem;
#ifdef __cplusplus
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                interface ISpatialCoordinateSystem;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics ABI::Windows::Perception::Spatial::ISpatialAnchorStatics
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                interface ISpatialAnchorStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor;
#ifdef __cplusplus
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor ABI::Windows::Perception::Spatial::ISpatialAnchor
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                interface ISpatialAnchor;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency;
#ifdef __cplusplus
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency ABI::Windows::Perception::Spatial::ISpatialAnchorExportSufficiency
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                interface ISpatialAnchorExportSufficiency;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs ABI::Windows::Perception::Spatial::ISpatialAnchorRawCoordinateSystemAdjustedEventArgs
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                interface ISpatialAnchorRawCoordinateSystemAdjustedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter;
#ifdef __cplusplus
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter ABI::Windows::Perception::Spatial::ISpatialAnchorExporter
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                interface ISpatialAnchorExporter;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics ABI::Windows::Perception::Spatial::ISpatialAnchorExporterStatics
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                interface ISpatialAnchorExporterStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingVolume_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingVolume_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                class SpatialBoundingVolume;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingVolume __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingVolume;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingVolume_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CSpatialCoordinateSystem_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CSpatialCoordinateSystem_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                class SpatialCoordinateSystem;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialCoordinateSystem __x_ABI_CWindows_CPerception_CSpatial_CSpatialCoordinateSystem;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CPerception_CSpatial_CSpatialCoordinateSystem_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchor_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchor_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                class SpatialAnchor;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchor __x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchor;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchor_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorExportSufficiency_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorExportSufficiency_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                class SpatialAnchorExportSufficiency;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorExportSufficiency __x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorExportSufficiency;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorExportSufficiency_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorRawCoordinateSystemAdjustedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorRawCoordinateSystemAdjustedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                class SpatialAnchorRawCoordinateSystemAdjustedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorRawCoordinateSystemAdjustedEventArgs __x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorRawCoordinateSystemAdjustedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorRawCoordinateSystemAdjustedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorExporter_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorExporter_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                class SpatialAnchorExporter;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorExporter __x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorExporter;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorExporter_FWD_DEFINED__ */

#ifndef ____FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_FWD_DEFINED__
#define ____FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_FWD_DEFINED__
#define ____FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_SpatialPerceptionAccessStatus_FWD_DEFINED__
#define ____FIAsyncOperation_1_SpatialPerceptionAccessStatus_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_SpatialPerceptionAccessStatus __FIAsyncOperation_1_SpatialPerceptionAccessStatus;
#ifdef __cplusplus
#define __FIAsyncOperation_1_SpatialPerceptionAccessStatus ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_SpatialBoundingBox_FWD_DEFINED__
#define ____FIReference_1_SpatialBoundingBox_FWD_DEFINED__
typedef interface __FIReference_1_SpatialBoundingBox __FIReference_1_SpatialBoundingBox;
#ifdef __cplusplus
#define __FIReference_1_SpatialBoundingBox ABI::Windows::Foundation::IReference<ABI::Windows::Perception::Spatial::SpatialBoundingBox >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_SpatialBoundingFrustum_FWD_DEFINED__
#define ____FIReference_1_SpatialBoundingFrustum_FWD_DEFINED__
typedef interface __FIReference_1_SpatialBoundingFrustum __FIReference_1_SpatialBoundingFrustum;
#ifdef __cplusplus
#define __FIReference_1_SpatialBoundingFrustum ABI::Windows::Foundation::IReference<ABI::Windows::Perception::Spatial::SpatialBoundingFrustum >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_SpatialBoundingOrientedBox_FWD_DEFINED__
#define ____FIReference_1_SpatialBoundingOrientedBox_FWD_DEFINED__
typedef interface __FIReference_1_SpatialBoundingOrientedBox __FIReference_1_SpatialBoundingOrientedBox;
#ifdef __cplusplus
#define __FIReference_1_SpatialBoundingOrientedBox ABI::Windows::Foundation::IReference<ABI::Windows::Perception::Spatial::SpatialBoundingOrientedBox >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Perception::Spatial::SpatialAnchor*,ABI::Windows::Perception::Spatial::SpatialAnchorRawCoordinateSystemAdjustedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Perception::Spatial::SpatialAnchorExportSufficiency* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Perception::Spatial::SpatialAnchorExportSufficiency* >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <inspectable.h>
#include <asyncinfo.h>
#include <eventtoken.h>
#include <windowscontracts.h>
#include <windows.foundation.h>
#include <windows.foundation.numerics.h>
#include <windows.storage.streams.h>

#ifdef __cplusplus
extern "C" {
#endif

#if !defined(WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION)
#define WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION 0xe0000
#endif // defined(WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION)

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CSpatialPerceptionAccessStatus_ENUM_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CSpatialPerceptionAccessStatus_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                enum SpatialPerceptionAccessStatus {
                    SpatialPerceptionAccessStatus_Unspecified = 0,
                    SpatialPerceptionAccessStatus_Allowed = 1,
                    SpatialPerceptionAccessStatus_DeniedByUser = 2,
                    SpatialPerceptionAccessStatus_DeniedBySystem = 3
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CPerception_CSpatial_CSpatialPerceptionAccessStatus {
    SpatialPerceptionAccessStatus_Unspecified = 0,
    SpatialPerceptionAccessStatus_Allowed = 1,
    SpatialPerceptionAccessStatus_DeniedByUser = 2,
    SpatialPerceptionAccessStatus_DeniedBySystem = 3
};
#ifdef WIDL_using_Windows_Perception_Spatial
#define SpatialPerceptionAccessStatus __x_ABI_CWindows_CPerception_CSpatial_CSpatialPerceptionAccessStatus
#endif /* WIDL_using_Windows_Perception_Spatial */
#endif

#endif /* ____x_ABI_CWindows_CPerception_CSpatial_CSpatialPerceptionAccessStatus_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CPerception_CSpatial_CSpatialPerceptionAccessStatus __x_ABI_CWindows_CPerception_CSpatial_CSpatialPerceptionAccessStatus;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingBox __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingBox;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                typedef struct SpatialBoundingBox SpatialBoundingBox;
            }
        }
    }
}
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingFrustum __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingFrustum;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                typedef struct SpatialBoundingFrustum SpatialBoundingFrustum;
            }
        }
    }
}
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingOrientedBox __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingOrientedBox;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                typedef struct SpatialBoundingOrientedBox SpatialBoundingOrientedBox;
            }
        }
    }
}
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingSphere __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingSphere;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                typedef struct SpatialBoundingSphere SpatialBoundingSphere;
            }
        }
    }
}
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorExportPurpose_ENUM_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorExportPurpose_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                enum SpatialAnchorExportPurpose {
                    SpatialAnchorExportPurpose_Relocalization = 0,
                    SpatialAnchorExportPurpose_Sharing = 1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorExportPurpose {
    SpatialAnchorExportPurpose_Relocalization = 0,
    SpatialAnchorExportPurpose_Sharing = 1
};
#ifdef WIDL_using_Windows_Perception_Spatial
#define SpatialAnchorExportPurpose __x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorExportPurpose
#endif /* WIDL_using_Windows_Perception_Spatial */
#endif

#endif /* ____x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorExportPurpose_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorExportPurpose __x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorExportPurpose;
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume;
#ifdef __cplusplus
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume ABI::Windows::Perception::Spatial::ISpatialBoundingVolume
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                interface ISpatialBoundingVolume;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics ABI::Windows::Perception::Spatial::ISpatialBoundingVolumeStatics
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                interface ISpatialBoundingVolumeStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem;
#ifdef __cplusplus
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                interface ISpatialCoordinateSystem;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs ABI::Windows::Perception::Spatial::ISpatialAnchorRawCoordinateSystemAdjustedEventArgs
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                interface ISpatialAnchorRawCoordinateSystemAdjustedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor;
#ifdef __cplusplus
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor ABI::Windows::Perception::Spatial::ISpatialAnchor
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                interface ISpatialAnchor;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics ABI::Windows::Perception::Spatial::ISpatialAnchorStatics
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                interface ISpatialAnchorStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency;
#ifdef __cplusplus
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency ABI::Windows::Perception::Spatial::ISpatialAnchorExportSufficiency
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                interface ISpatialAnchorExportSufficiency;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter;
#ifdef __cplusplus
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter ABI::Windows::Perception::Spatial::ISpatialAnchorExporter
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                interface ISpatialAnchorExporter;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics ABI::Windows::Perception::Spatial::ISpatialAnchorExporterStatics
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                interface ISpatialAnchorExporterStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_FWD_DEFINED__
#define ____FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_FWD_DEFINED__
#define ____FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_SpatialPerceptionAccessStatus_FWD_DEFINED__
#define ____FIAsyncOperation_1_SpatialPerceptionAccessStatus_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_SpatialPerceptionAccessStatus __FIAsyncOperation_1_SpatialPerceptionAccessStatus;
#ifdef __cplusplus
#define __FIAsyncOperation_1_SpatialPerceptionAccessStatus ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_SpatialBoundingBox_FWD_DEFINED__
#define ____FIReference_1_SpatialBoundingBox_FWD_DEFINED__
typedef interface __FIReference_1_SpatialBoundingBox __FIReference_1_SpatialBoundingBox;
#ifdef __cplusplus
#define __FIReference_1_SpatialBoundingBox ABI::Windows::Foundation::IReference<ABI::Windows::Perception::Spatial::SpatialBoundingBox >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_SpatialBoundingFrustum_FWD_DEFINED__
#define ____FIReference_1_SpatialBoundingFrustum_FWD_DEFINED__
typedef interface __FIReference_1_SpatialBoundingFrustum __FIReference_1_SpatialBoundingFrustum;
#ifdef __cplusplus
#define __FIReference_1_SpatialBoundingFrustum ABI::Windows::Foundation::IReference<ABI::Windows::Perception::Spatial::SpatialBoundingFrustum >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_SpatialBoundingOrientedBox_FWD_DEFINED__
#define ____FIReference_1_SpatialBoundingOrientedBox_FWD_DEFINED__
typedef interface __FIReference_1_SpatialBoundingOrientedBox __FIReference_1_SpatialBoundingOrientedBox;
#ifdef __cplusplus
#define __FIReference_1_SpatialBoundingOrientedBox ABI::Windows::Foundation::IReference<ABI::Windows::Perception::Spatial::SpatialBoundingOrientedBox >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Perception::Spatial::SpatialAnchorExportSufficiency* >
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                struct SpatialBoundingBox {
                    ABI::Windows::Foundation::Numerics::Vector3 Center;
                    ABI::Windows::Foundation::Numerics::Vector3 Extents;
                };
            }
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingBox {
    __x_ABI_CWindows_CFoundation_CNumerics_CVector3 Center;
    __x_ABI_CWindows_CFoundation_CNumerics_CVector3 Extents;
};
#ifdef WIDL_using_Windows_Perception_Spatial
#define SpatialBoundingBox __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingBox
#endif /* WIDL_using_Windows_Perception_Spatial */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                struct SpatialBoundingFrustum {
                    ABI::Windows::Foundation::Numerics::Plane Near;
                    ABI::Windows::Foundation::Numerics::Plane Far;
                    ABI::Windows::Foundation::Numerics::Plane Right;
                    ABI::Windows::Foundation::Numerics::Plane Left;
                    ABI::Windows::Foundation::Numerics::Plane Top;
                    ABI::Windows::Foundation::Numerics::Plane Bottom;
                };
            }
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingFrustum {
    __x_ABI_CWindows_CFoundation_CNumerics_CPlane Near;
    __x_ABI_CWindows_CFoundation_CNumerics_CPlane Far;
    __x_ABI_CWindows_CFoundation_CNumerics_CPlane Right;
    __x_ABI_CWindows_CFoundation_CNumerics_CPlane Left;
    __x_ABI_CWindows_CFoundation_CNumerics_CPlane Top;
    __x_ABI_CWindows_CFoundation_CNumerics_CPlane Bottom;
};
#ifdef WIDL_using_Windows_Perception_Spatial
#define SpatialBoundingFrustum __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingFrustum
#endif /* WIDL_using_Windows_Perception_Spatial */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                struct SpatialBoundingOrientedBox {
                    ABI::Windows::Foundation::Numerics::Vector3 Center;
                    ABI::Windows::Foundation::Numerics::Vector3 Extents;
                    ABI::Windows::Foundation::Numerics::Quaternion Orientation;
                };
            }
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingOrientedBox {
    __x_ABI_CWindows_CFoundation_CNumerics_CVector3 Center;
    __x_ABI_CWindows_CFoundation_CNumerics_CVector3 Extents;
    __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion Orientation;
};
#ifdef WIDL_using_Windows_Perception_Spatial
#define SpatialBoundingOrientedBox __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingOrientedBox
#endif /* WIDL_using_Windows_Perception_Spatial */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                struct SpatialBoundingSphere {
                    ABI::Windows::Foundation::Numerics::Vector3 Center;
                    FLOAT Radius;
                };
            }
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingSphere {
    __x_ABI_CWindows_CFoundation_CNumerics_CVector3 Center;
    FLOAT Radius;
};
#ifdef WIDL_using_Windows_Perception_Spatial
#define SpatialBoundingSphere __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingSphere
#endif /* WIDL_using_Windows_Perception_Spatial */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
/*****************************************************************************
 * ISpatialBoundingVolume interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume, 0xfb2065da, 0x68c3, 0x33df, 0xb7,0xaf, 0x4c,0x78,0x72,0x07,0x99,0x9c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                MIDL_INTERFACE("fb2065da-68c3-33df-b7af-4c787207999c")
                ISpatialBoundingVolume : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume, 0xfb2065da, 0x68c3, 0x33df, 0xb7,0xaf, 0x4c,0x78,0x72,0x07,0x99,0x9c)
#endif
#else
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeVtbl;

interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume {
    CONST_VTBL __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_QueryInterface(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_AddRef(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_Release(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_GetIids(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_GetRuntimeClassName(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_GetTrustLevel(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_Perception_Spatial
#define IID_ISpatialBoundingVolume IID___x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume
#define ISpatialBoundingVolumeVtbl __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeVtbl
#define ISpatialBoundingVolume __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume
#define ISpatialBoundingVolume_QueryInterface __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_QueryInterface
#define ISpatialBoundingVolume_AddRef __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_AddRef
#define ISpatialBoundingVolume_Release __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_Release
#define ISpatialBoundingVolume_GetIids __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_GetIids
#define ISpatialBoundingVolume_GetRuntimeClassName __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_GetRuntimeClassName
#define ISpatialBoundingVolume_GetTrustLevel __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_GetTrustLevel
#endif /* WIDL_using_Windows_Perception_Spatial */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ISpatialBoundingVolumeStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics, 0x05889117, 0xb3e1, 0x36d8, 0xb0,0x17, 0x56,0x61,0x81,0xa5,0xb1,0x96);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                MIDL_INTERFACE("05889117-b3e1-36d8-b017-566181a5b196")
                ISpatialBoundingVolumeStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE FromBox(
                        ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem *system,
                        ABI::Windows::Perception::Spatial::SpatialBoundingBox box,
                        ABI::Windows::Perception::Spatial::ISpatialBoundingVolume **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FromOrientedBox(
                        ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem *system,
                        ABI::Windows::Perception::Spatial::SpatialBoundingOrientedBox box,
                        ABI::Windows::Perception::Spatial::ISpatialBoundingVolume **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FromSphere(
                        ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem *system,
                        ABI::Windows::Perception::Spatial::SpatialBoundingSphere sphere,
                        ABI::Windows::Perception::Spatial::ISpatialBoundingVolume **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FromFrustum(
                        ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem *system,
                        ABI::Windows::Perception::Spatial::SpatialBoundingFrustum frustum,
                        ABI::Windows::Perception::Spatial::ISpatialBoundingVolume **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics, 0x05889117, 0xb3e1, 0x36d8, 0xb0,0x17, 0x56,0x61,0x81,0xa5,0xb1,0x96)
#endif
#else
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStaticsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics *This,
        TrustLevel *trustLevel);

    /*** ISpatialBoundingVolumeStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *FromBox)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *system,
        __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingBox box,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume **value);

    HRESULT (STDMETHODCALLTYPE *FromOrientedBox)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *system,
        __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingOrientedBox box,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume **value);

    HRESULT (STDMETHODCALLTYPE *FromSphere)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *system,
        __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingSphere sphere,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume **value);

    HRESULT (STDMETHODCALLTYPE *FromFrustum)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *system,
        __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingFrustum frustum,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume **value);

    END_INTERFACE
} __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStaticsVtbl;

interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics {
    CONST_VTBL __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpatialBoundingVolumeStatics methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FromBox(This,system,box,value) (This)->lpVtbl->FromBox(This,system,box,value)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FromOrientedBox(This,system,box,value) (This)->lpVtbl->FromOrientedBox(This,system,box,value)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FromSphere(This,system,sphere,value) (This)->lpVtbl->FromSphere(This,system,sphere,value)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FromFrustum(This,system,frustum,value) (This)->lpVtbl->FromFrustum(This,system,frustum,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_QueryInterface(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_AddRef(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_Release(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_GetIids(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_GetRuntimeClassName(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_GetTrustLevel(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpatialBoundingVolumeStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FromBox(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *system,__x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingBox box,__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume **value) {
    return This->lpVtbl->FromBox(This,system,box,value);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FromOrientedBox(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *system,__x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingOrientedBox box,__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume **value) {
    return This->lpVtbl->FromOrientedBox(This,system,box,value);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FromSphere(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *system,__x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingSphere sphere,__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume **value) {
    return This->lpVtbl->FromSphere(This,system,sphere,value);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FromFrustum(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *system,__x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingFrustum frustum,__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume **value) {
    return This->lpVtbl->FromFrustum(This,system,frustum,value);
}
#endif
#ifdef WIDL_using_Windows_Perception_Spatial
#define IID_ISpatialBoundingVolumeStatics IID___x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics
#define ISpatialBoundingVolumeStaticsVtbl __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStaticsVtbl
#define ISpatialBoundingVolumeStatics __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics
#define ISpatialBoundingVolumeStatics_QueryInterface __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_QueryInterface
#define ISpatialBoundingVolumeStatics_AddRef __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_AddRef
#define ISpatialBoundingVolumeStatics_Release __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_Release
#define ISpatialBoundingVolumeStatics_GetIids __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_GetIids
#define ISpatialBoundingVolumeStatics_GetRuntimeClassName __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_GetRuntimeClassName
#define ISpatialBoundingVolumeStatics_GetTrustLevel __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_GetTrustLevel
#define ISpatialBoundingVolumeStatics_FromBox __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FromBox
#define ISpatialBoundingVolumeStatics_FromOrientedBox __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FromOrientedBox
#define ISpatialBoundingVolumeStatics_FromSphere __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FromSphere
#define ISpatialBoundingVolumeStatics_FromFrustum __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FromFrustum
#endif /* WIDL_using_Windows_Perception_Spatial */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ISpatialCoordinateSystem interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem, 0x69ebca4b, 0x60a3, 0x3586, 0xa6,0x53, 0x59,0xa7,0xbd,0x67,0x6d,0x07);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                MIDL_INTERFACE("69ebca4b-60a3-3586-a653-59a7bd676d07")
                ISpatialCoordinateSystem : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE TryGetTransformTo(
                        ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem *target,
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::Numerics::Matrix4x4 > **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem, 0x69ebca4b, 0x60a3, 0x3586, 0xa6,0x53, 0x59,0xa7,0xbd,0x67,0x6d,0x07)
#endif
#else
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystemVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *This,
        TrustLevel *trustLevel);

    /*** ISpatialCoordinateSystem methods ***/
    HRESULT (STDMETHODCALLTYPE *TryGetTransformTo)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *target,
        __FIReference_1_Matrix4x4 **value);

    END_INTERFACE
} __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystemVtbl;

interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem {
    CONST_VTBL __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpatialCoordinateSystem methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_TryGetTransformTo(This,target,value) (This)->lpVtbl->TryGetTransformTo(This,target,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_QueryInterface(__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_AddRef(__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_Release(__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_GetIids(__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_GetRuntimeClassName(__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_GetTrustLevel(__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpatialCoordinateSystem methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_TryGetTransformTo(__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *target,__FIReference_1_Matrix4x4 **value) {
    return This->lpVtbl->TryGetTransformTo(This,target,value);
}
#endif
#ifdef WIDL_using_Windows_Perception_Spatial
#define IID_ISpatialCoordinateSystem IID___x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem
#define ISpatialCoordinateSystemVtbl __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystemVtbl
#define ISpatialCoordinateSystem __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem
#define ISpatialCoordinateSystem_QueryInterface __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_QueryInterface
#define ISpatialCoordinateSystem_AddRef __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_AddRef
#define ISpatialCoordinateSystem_Release __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_Release
#define ISpatialCoordinateSystem_GetIids __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_GetIids
#define ISpatialCoordinateSystem_GetRuntimeClassName __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_GetRuntimeClassName
#define ISpatialCoordinateSystem_GetTrustLevel __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_GetTrustLevel
#define ISpatialCoordinateSystem_TryGetTransformTo __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_TryGetTransformTo
#endif /* WIDL_using_Windows_Perception_Spatial */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ISpatialAnchorStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics, 0xa9928642, 0x0174, 0x311c, 0xae,0x79, 0x0e,0x51,0x07,0x66,0x9f,0x16);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                MIDL_INTERFACE("a9928642-0174-311c-ae79-0e5107669f16")
                ISpatialAnchorStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE TryCreateRelativeTo(
                        ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem *coord_system,
                        ABI::Windows::Perception::Spatial::ISpatialAnchor **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryCreateWithPositionRelativeTo(
                        ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem *coord_system,
                        ABI::Windows::Foundation::Numerics::Vector3 position,
                        ABI::Windows::Perception::Spatial::ISpatialAnchor **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryCreateWithPositionAndOrientationRelativeTo(
                        ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem *coord_system,
                        ABI::Windows::Foundation::Numerics::Vector3 position,
                        ABI::Windows::Foundation::Numerics::Quaternion orientation,
                        ABI::Windows::Perception::Spatial::ISpatialAnchor **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics, 0xa9928642, 0x0174, 0x311c, 0xae,0x79, 0x0e,0x51,0x07,0x66,0x9f,0x16)
#endif
#else
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStaticsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics *This,
        TrustLevel *trustLevel);

    /*** ISpatialAnchorStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *TryCreateRelativeTo)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *coord_system,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor **value);

    HRESULT (STDMETHODCALLTYPE *TryCreateWithPositionRelativeTo)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *coord_system,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector3 position,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor **value);

    HRESULT (STDMETHODCALLTYPE *TryCreateWithPositionAndOrientationRelativeTo)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *coord_system,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector3 position,
        __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion orientation,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor **value);

    END_INTERFACE
} __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStaticsVtbl;

interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics {
    CONST_VTBL __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpatialAnchorStatics methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_TryCreateRelativeTo(This,coord_system,value) (This)->lpVtbl->TryCreateRelativeTo(This,coord_system,value)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_TryCreateWithPositionRelativeTo(This,coord_system,position,value) (This)->lpVtbl->TryCreateWithPositionRelativeTo(This,coord_system,position,value)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_TryCreateWithPositionAndOrientationRelativeTo(This,coord_system,position,orientation,value) (This)->lpVtbl->TryCreateWithPositionAndOrientationRelativeTo(This,coord_system,position,orientation,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_QueryInterface(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_AddRef(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_Release(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_GetIids(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_GetRuntimeClassName(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_GetTrustLevel(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpatialAnchorStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_TryCreateRelativeTo(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *coord_system,__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor **value) {
    return This->lpVtbl->TryCreateRelativeTo(This,coord_system,value);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_TryCreateWithPositionRelativeTo(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *coord_system,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 position,__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor **value) {
    return This->lpVtbl->TryCreateWithPositionRelativeTo(This,coord_system,position,value);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_TryCreateWithPositionAndOrientationRelativeTo(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *coord_system,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 position,__x_ABI_CWindows_CFoundation_CNumerics_CQuaternion orientation,__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor **value) {
    return This->lpVtbl->TryCreateWithPositionAndOrientationRelativeTo(This,coord_system,position,orientation,value);
}
#endif
#ifdef WIDL_using_Windows_Perception_Spatial
#define IID_ISpatialAnchorStatics IID___x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics
#define ISpatialAnchorStaticsVtbl __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStaticsVtbl
#define ISpatialAnchorStatics __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics
#define ISpatialAnchorStatics_QueryInterface __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_QueryInterface
#define ISpatialAnchorStatics_AddRef __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_AddRef
#define ISpatialAnchorStatics_Release __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_Release
#define ISpatialAnchorStatics_GetIids __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_GetIids
#define ISpatialAnchorStatics_GetRuntimeClassName __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_GetRuntimeClassName
#define ISpatialAnchorStatics_GetTrustLevel __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_GetTrustLevel
#define ISpatialAnchorStatics_TryCreateRelativeTo __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_TryCreateRelativeTo
#define ISpatialAnchorStatics_TryCreateWithPositionRelativeTo __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_TryCreateWithPositionRelativeTo
#define ISpatialAnchorStatics_TryCreateWithPositionAndOrientationRelativeTo __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_TryCreateWithPositionAndOrientationRelativeTo
#endif /* WIDL_using_Windows_Perception_Spatial */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ISpatialAnchor interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor, 0x0529e5ce, 0x1d34, 0x3702, 0xbc,0xec, 0xea,0xbf,0xf5,0x78,0xa8,0x69);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                MIDL_INTERFACE("0529e5ce-1d34-3702-bcec-eabff578a869")
                ISpatialAnchor : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_CoordinateSystem(
                        ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_RawCoordinateSystem(
                        ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_RawCoordinateSystemAdjusted(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Perception::Spatial::SpatialAnchor*,ABI::Windows::Perception::Spatial::SpatialAnchorRawCoordinateSystemAdjustedEventArgs* > *handler,
                        EventRegistrationToken *cookie) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_RawCoordinateSystemAdjusted(
                        EventRegistrationToken cookie) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor, 0x0529e5ce, 0x1d34, 0x3702, 0xbc,0xec, 0xea,0xbf,0xf5,0x78,0xa8,0x69)
#endif
#else
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor *This,
        TrustLevel *trustLevel);

    /*** ISpatialAnchor methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CoordinateSystem)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem **value);

    HRESULT (STDMETHODCALLTYPE *get_RawCoordinateSystem)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem **value);

    HRESULT (STDMETHODCALLTYPE *add_RawCoordinateSystemAdjusted)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor *This,
        __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs *handler,
        EventRegistrationToken *cookie);

    HRESULT (STDMETHODCALLTYPE *remove_RawCoordinateSystemAdjusted)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor *This,
        EventRegistrationToken cookie);

    END_INTERFACE
} __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorVtbl;

interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor {
    CONST_VTBL __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpatialAnchor methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_get_CoordinateSystem(This,value) (This)->lpVtbl->get_CoordinateSystem(This,value)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_get_RawCoordinateSystem(This,value) (This)->lpVtbl->get_RawCoordinateSystem(This,value)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_add_RawCoordinateSystemAdjusted(This,handler,cookie) (This)->lpVtbl->add_RawCoordinateSystemAdjusted(This,handler,cookie)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_remove_RawCoordinateSystemAdjusted(This,cookie) (This)->lpVtbl->remove_RawCoordinateSystemAdjusted(This,cookie)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_QueryInterface(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_AddRef(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_Release(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_GetIids(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_GetRuntimeClassName(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_GetTrustLevel(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpatialAnchor methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_get_CoordinateSystem(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem **value) {
    return This->lpVtbl->get_CoordinateSystem(This,value);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_get_RawCoordinateSystem(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem **value) {
    return This->lpVtbl->get_RawCoordinateSystem(This,value);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_add_RawCoordinateSystemAdjusted(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor* This,__FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs *handler,EventRegistrationToken *cookie) {
    return This->lpVtbl->add_RawCoordinateSystemAdjusted(This,handler,cookie);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_remove_RawCoordinateSystemAdjusted(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor* This,EventRegistrationToken cookie) {
    return This->lpVtbl->remove_RawCoordinateSystemAdjusted(This,cookie);
}
#endif
#ifdef WIDL_using_Windows_Perception_Spatial
#define IID_ISpatialAnchor IID___x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor
#define ISpatialAnchorVtbl __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorVtbl
#define ISpatialAnchor __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor
#define ISpatialAnchor_QueryInterface __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_QueryInterface
#define ISpatialAnchor_AddRef __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_AddRef
#define ISpatialAnchor_Release __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_Release
#define ISpatialAnchor_GetIids __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_GetIids
#define ISpatialAnchor_GetRuntimeClassName __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_GetRuntimeClassName
#define ISpatialAnchor_GetTrustLevel __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_GetTrustLevel
#define ISpatialAnchor_get_CoordinateSystem __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_get_CoordinateSystem
#define ISpatialAnchor_get_RawCoordinateSystem __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_get_RawCoordinateSystem
#define ISpatialAnchor_add_RawCoordinateSystemAdjusted __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_add_RawCoordinateSystemAdjusted
#define ISpatialAnchor_remove_RawCoordinateSystemAdjusted __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_remove_RawCoordinateSystemAdjusted
#endif /* WIDL_using_Windows_Perception_Spatial */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ISpatialAnchorExportSufficiency interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency, 0x77c25b2b, 0x3409, 0x4088, 0xb9,0x1b, 0xfd,0xfd,0x05,0xd1,0x64,0x8f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                MIDL_INTERFACE("77c25b2b-3409-4088-b91b-fdfd05d1648f")
                ISpatialAnchorExportSufficiency : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_IsMinimallySufficient(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SufficiencyLevel(
                        DOUBLE *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_RecommendedSufficiencyLevel(
                        DOUBLE *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency, 0x77c25b2b, 0x3409, 0x4088, 0xb9,0x1b, 0xfd,0xfd,0x05,0xd1,0x64,0x8f)
#endif
#else
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiencyVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency *This,
        TrustLevel *trustLevel);

    /*** ISpatialAnchorExportSufficiency methods ***/
    HRESULT (STDMETHODCALLTYPE *get_IsMinimallySufficient)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_SufficiencyLevel)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency *This,
        DOUBLE *value);

    HRESULT (STDMETHODCALLTYPE *get_RecommendedSufficiencyLevel)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency *This,
        DOUBLE *value);

    END_INTERFACE
} __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiencyVtbl;

interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency {
    CONST_VTBL __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiencyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpatialAnchorExportSufficiency methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_get_IsMinimallySufficient(This,value) (This)->lpVtbl->get_IsMinimallySufficient(This,value)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_get_SufficiencyLevel(This,value) (This)->lpVtbl->get_SufficiencyLevel(This,value)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_get_RecommendedSufficiencyLevel(This,value) (This)->lpVtbl->get_RecommendedSufficiencyLevel(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_QueryInterface(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_AddRef(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_Release(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_GetIids(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_GetRuntimeClassName(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_GetTrustLevel(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpatialAnchorExportSufficiency methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_get_IsMinimallySufficient(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency* This,boolean *value) {
    return This->lpVtbl->get_IsMinimallySufficient(This,value);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_get_SufficiencyLevel(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency* This,DOUBLE *value) {
    return This->lpVtbl->get_SufficiencyLevel(This,value);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_get_RecommendedSufficiencyLevel(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency* This,DOUBLE *value) {
    return This->lpVtbl->get_RecommendedSufficiencyLevel(This,value);
}
#endif
#ifdef WIDL_using_Windows_Perception_Spatial
#define IID_ISpatialAnchorExportSufficiency IID___x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency
#define ISpatialAnchorExportSufficiencyVtbl __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiencyVtbl
#define ISpatialAnchorExportSufficiency __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency
#define ISpatialAnchorExportSufficiency_QueryInterface __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_QueryInterface
#define ISpatialAnchorExportSufficiency_AddRef __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_AddRef
#define ISpatialAnchorExportSufficiency_Release __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_Release
#define ISpatialAnchorExportSufficiency_GetIids __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_GetIids
#define ISpatialAnchorExportSufficiency_GetRuntimeClassName __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_GetRuntimeClassName
#define ISpatialAnchorExportSufficiency_GetTrustLevel __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_GetTrustLevel
#define ISpatialAnchorExportSufficiency_get_IsMinimallySufficient __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_get_IsMinimallySufficient
#define ISpatialAnchorExportSufficiency_get_SufficiencyLevel __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_get_SufficiencyLevel
#define ISpatialAnchorExportSufficiency_get_RecommendedSufficiencyLevel __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_get_RecommendedSufficiencyLevel
#endif /* WIDL_using_Windows_Perception_Spatial */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */

/*****************************************************************************
 * ISpatialAnchorRawCoordinateSystemAdjustedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs, 0xa1e81eb8, 0x56c7, 0x3117, 0xa2,0xe4, 0x81,0xe0,0xfc,0xf2,0x8e,0x00);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                MIDL_INTERFACE("a1e81eb8-56c7-3117-a2e4-81e0fcf28e00")
                ISpatialAnchorRawCoordinateSystemAdjustedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_OldRawCoordinateSystemToNewRawCoordinateSystemTransform(
                        ABI::Windows::Foundation::Numerics::Matrix4x4 *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs, 0xa1e81eb8, 0x56c7, 0x3117, 0xa2,0xe4, 0x81,0xe0,0xfc,0xf2,0x8e,0x00)
#endif
#else
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs *This,
        TrustLevel *trustLevel);

    /*** ISpatialAnchorRawCoordinateSystemAdjustedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_OldRawCoordinateSystemToNewRawCoordinateSystemTransform)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs *This,
        __x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 *value);

    END_INTERFACE
} __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgsVtbl;

interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpatialAnchorRawCoordinateSystemAdjustedEventArgs methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_get_OldRawCoordinateSystemToNewRawCoordinateSystemTransform(This,value) (This)->lpVtbl->get_OldRawCoordinateSystemToNewRawCoordinateSystemTransform(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_QueryInterface(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_AddRef(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_Release(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_GetIids(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_GetTrustLevel(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpatialAnchorRawCoordinateSystemAdjustedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_get_OldRawCoordinateSystemToNewRawCoordinateSystemTransform(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs* This,__x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 *value) {
    return This->lpVtbl->get_OldRawCoordinateSystemToNewRawCoordinateSystemTransform(This,value);
}
#endif
#ifdef WIDL_using_Windows_Perception_Spatial
#define IID_ISpatialAnchorRawCoordinateSystemAdjustedEventArgs IID___x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs
#define ISpatialAnchorRawCoordinateSystemAdjustedEventArgsVtbl __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgsVtbl
#define ISpatialAnchorRawCoordinateSystemAdjustedEventArgs __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs
#define ISpatialAnchorRawCoordinateSystemAdjustedEventArgs_QueryInterface __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_QueryInterface
#define ISpatialAnchorRawCoordinateSystemAdjustedEventArgs_AddRef __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_AddRef
#define ISpatialAnchorRawCoordinateSystemAdjustedEventArgs_Release __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_Release
#define ISpatialAnchorRawCoordinateSystemAdjustedEventArgs_GetIids __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_GetIids
#define ISpatialAnchorRawCoordinateSystemAdjustedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_GetRuntimeClassName
#define ISpatialAnchorRawCoordinateSystemAdjustedEventArgs_GetTrustLevel __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_GetTrustLevel
#define ISpatialAnchorRawCoordinateSystemAdjustedEventArgs_get_OldRawCoordinateSystemToNewRawCoordinateSystemTransform __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_get_OldRawCoordinateSystemToNewRawCoordinateSystemTransform
#endif /* WIDL_using_Windows_Perception_Spatial */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ISpatialAnchorExporter interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter, 0x9a2a4338, 0x24fb, 0x4269, 0x89,0xc5, 0x88,0x30,0x4a,0xee,0xf2,0x0f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                MIDL_INTERFACE("9a2a4338-24fb-4269-89c5-88304aeef20f")
                ISpatialAnchorExporter : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetAnchorExportSufficiencyAsync(
                        ABI::Windows::Perception::Spatial::ISpatialAnchor *anchor,
                        ABI::Windows::Perception::Spatial::SpatialAnchorExportPurpose purpose,
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Perception::Spatial::SpatialAnchorExportSufficiency* > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryExportAnchorAsync(
                        ABI::Windows::Perception::Spatial::ISpatialAnchor *anchor,
                        ABI::Windows::Perception::Spatial::SpatialAnchorExportPurpose purpose,
                        ABI::Windows::Storage::Streams::IOutputStream *stream,
                        ABI::Windows::Foundation::IAsyncOperation<boolean > **operation) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter, 0x9a2a4338, 0x24fb, 0x4269, 0x89,0xc5, 0x88,0x30,0x4a,0xee,0xf2,0x0f)
#endif
#else
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter *This,
        TrustLevel *trustLevel);

    /*** ISpatialAnchorExporter methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAnchorExportSufficiencyAsync)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor *anchor,
        __x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorExportPurpose purpose,
        __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency **operation);

    HRESULT (STDMETHODCALLTYPE *TryExportAnchorAsync)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor *anchor,
        __x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorExportPurpose purpose,
        __x_ABI_CWindows_CStorage_CStreams_CIOutputStream *stream,
        __FIAsyncOperation_1_boolean **operation);

    END_INTERFACE
} __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterVtbl;

interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter {
    CONST_VTBL __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpatialAnchorExporter methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_GetAnchorExportSufficiencyAsync(This,anchor,purpose,operation) (This)->lpVtbl->GetAnchorExportSufficiencyAsync(This,anchor,purpose,operation)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_TryExportAnchorAsync(This,anchor,purpose,stream,operation) (This)->lpVtbl->TryExportAnchorAsync(This,anchor,purpose,stream,operation)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_QueryInterface(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_AddRef(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_Release(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_GetIids(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_GetRuntimeClassName(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_GetTrustLevel(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpatialAnchorExporter methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_GetAnchorExportSufficiencyAsync(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor *anchor,__x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorExportPurpose purpose,__FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency **operation) {
    return This->lpVtbl->GetAnchorExportSufficiencyAsync(This,anchor,purpose,operation);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_TryExportAnchorAsync(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor *anchor,__x_ABI_CWindows_CPerception_CSpatial_CSpatialAnchorExportPurpose purpose,__x_ABI_CWindows_CStorage_CStreams_CIOutputStream *stream,__FIAsyncOperation_1_boolean **operation) {
    return This->lpVtbl->TryExportAnchorAsync(This,anchor,purpose,stream,operation);
}
#endif
#ifdef WIDL_using_Windows_Perception_Spatial
#define IID_ISpatialAnchorExporter IID___x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter
#define ISpatialAnchorExporterVtbl __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterVtbl
#define ISpatialAnchorExporter __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter
#define ISpatialAnchorExporter_QueryInterface __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_QueryInterface
#define ISpatialAnchorExporter_AddRef __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_AddRef
#define ISpatialAnchorExporter_Release __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_Release
#define ISpatialAnchorExporter_GetIids __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_GetIids
#define ISpatialAnchorExporter_GetRuntimeClassName __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_GetRuntimeClassName
#define ISpatialAnchorExporter_GetTrustLevel __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_GetTrustLevel
#define ISpatialAnchorExporter_GetAnchorExportSufficiencyAsync __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_GetAnchorExportSufficiencyAsync
#define ISpatialAnchorExporter_TryExportAnchorAsync __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_TryExportAnchorAsync
#endif /* WIDL_using_Windows_Perception_Spatial */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */

/*****************************************************************************
 * ISpatialAnchorExporterStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics, 0xed2507b8, 0x2475, 0x439c, 0x85,0xff, 0x7f,0xed,0x34,0x1f,0xdc,0x88);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                MIDL_INTERFACE("ed2507b8-2475-439c-85ff-7fed341fdc88")
                ISpatialAnchorExporterStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetDefault(
                        ABI::Windows::Perception::Spatial::ISpatialAnchorExporter **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RequestAccessAsync(
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus > **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics, 0xed2507b8, 0x2475, 0x439c, 0x85,0xff, 0x7f,0xed,0x34,0x1f,0xdc,0x88)
#endif
#else
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStaticsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics *This,
        TrustLevel *trustLevel);

    /*** ISpatialAnchorExporterStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDefault)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter **value);

    HRESULT (STDMETHODCALLTYPE *RequestAccessAsync)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics *This,
        __FIAsyncOperation_1_SpatialPerceptionAccessStatus **result);

    END_INTERFACE
} __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStaticsVtbl;

interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics {
    CONST_VTBL __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpatialAnchorExporterStatics methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_GetDefault(This,value) (This)->lpVtbl->GetDefault(This,value)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_RequestAccessAsync(This,result) (This)->lpVtbl->RequestAccessAsync(This,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_QueryInterface(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_AddRef(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_Release(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_GetIids(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_GetRuntimeClassName(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_GetTrustLevel(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpatialAnchorExporterStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_GetDefault(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporter **value) {
    return This->lpVtbl->GetDefault(This,value);
}
static inline HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_RequestAccessAsync(__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics* This,__FIAsyncOperation_1_SpatialPerceptionAccessStatus **result) {
    return This->lpVtbl->RequestAccessAsync(This,result);
}
#endif
#ifdef WIDL_using_Windows_Perception_Spatial
#define IID_ISpatialAnchorExporterStatics IID___x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics
#define ISpatialAnchorExporterStaticsVtbl __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStaticsVtbl
#define ISpatialAnchorExporterStatics __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics
#define ISpatialAnchorExporterStatics_QueryInterface __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_QueryInterface
#define ISpatialAnchorExporterStatics_AddRef __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_AddRef
#define ISpatialAnchorExporterStatics_Release __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_Release
#define ISpatialAnchorExporterStatics_GetIids __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_GetIids
#define ISpatialAnchorExporterStatics_GetRuntimeClassName __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_GetRuntimeClassName
#define ISpatialAnchorExporterStatics_GetTrustLevel __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_GetTrustLevel
#define ISpatialAnchorExporterStatics_GetDefault __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_GetDefault
#define ISpatialAnchorExporterStatics_RequestAccessAsync __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_RequestAccessAsync
#endif /* WIDL_using_Windows_Perception_Spatial */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExporterStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */

/*
 * Class Windows.Perception.Spatial.SpatialBoundingVolume
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_Perception_Spatial_SpatialBoundingVolume_DEFINED
#define RUNTIMECLASS_Windows_Perception_Spatial_SpatialBoundingVolume_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Perception_Spatial_SpatialBoundingVolume[] = {'W','i','n','d','o','w','s','.','P','e','r','c','e','p','t','i','o','n','.','S','p','a','t','i','a','l','.','S','p','a','t','i','a','l','B','o','u','n','d','i','n','g','V','o','l','u','m','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Perception_Spatial_SpatialBoundingVolume[] = L"Windows.Perception.Spatial.SpatialBoundingVolume";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Perception_Spatial_SpatialBoundingVolume[] = {'W','i','n','d','o','w','s','.','P','e','r','c','e','p','t','i','o','n','.','S','p','a','t','i','a','l','.','S','p','a','t','i','a','l','B','o','u','n','d','i','n','g','V','o','l','u','m','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_Perception_Spatial_SpatialBoundingVolume_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.Perception.Spatial.SpatialCoordinateSystem
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_Perception_Spatial_SpatialCoordinateSystem_DEFINED
#define RUNTIMECLASS_Windows_Perception_Spatial_SpatialCoordinateSystem_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Perception_Spatial_SpatialCoordinateSystem[] = {'W','i','n','d','o','w','s','.','P','e','r','c','e','p','t','i','o','n','.','S','p','a','t','i','a','l','.','S','p','a','t','i','a','l','C','o','o','r','d','i','n','a','t','e','S','y','s','t','e','m',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Perception_Spatial_SpatialCoordinateSystem[] = L"Windows.Perception.Spatial.SpatialCoordinateSystem";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Perception_Spatial_SpatialCoordinateSystem[] = {'W','i','n','d','o','w','s','.','P','e','r','c','e','p','t','i','o','n','.','S','p','a','t','i','a','l','.','S','p','a','t','i','a','l','C','o','o','r','d','i','n','a','t','e','S','y','s','t','e','m',0};
#endif
#endif /* RUNTIMECLASS_Windows_Perception_Spatial_SpatialCoordinateSystem_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.Perception.Spatial.SpatialAnchor
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_Perception_Spatial_SpatialAnchor_DEFINED
#define RUNTIMECLASS_Windows_Perception_Spatial_SpatialAnchor_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Perception_Spatial_SpatialAnchor[] = {'W','i','n','d','o','w','s','.','P','e','r','c','e','p','t','i','o','n','.','S','p','a','t','i','a','l','.','S','p','a','t','i','a','l','A','n','c','h','o','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Perception_Spatial_SpatialAnchor[] = L"Windows.Perception.Spatial.SpatialAnchor";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Perception_Spatial_SpatialAnchor[] = {'W','i','n','d','o','w','s','.','P','e','r','c','e','p','t','i','o','n','.','S','p','a','t','i','a','l','.','S','p','a','t','i','a','l','A','n','c','h','o','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_Perception_Spatial_SpatialAnchor_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.Perception.Spatial.SpatialAnchorExportSufficiency
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifndef RUNTIMECLASS_Windows_Perception_Spatial_SpatialAnchorExportSufficiency_DEFINED
#define RUNTIMECLASS_Windows_Perception_Spatial_SpatialAnchorExportSufficiency_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Perception_Spatial_SpatialAnchorExportSufficiency[] = {'W','i','n','d','o','w','s','.','P','e','r','c','e','p','t','i','o','n','.','S','p','a','t','i','a','l','.','S','p','a','t','i','a','l','A','n','c','h','o','r','E','x','p','o','r','t','S','u','f','f','i','c','i','e','n','c','y',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Perception_Spatial_SpatialAnchorExportSufficiency[] = L"Windows.Perception.Spatial.SpatialAnchorExportSufficiency";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Perception_Spatial_SpatialAnchorExportSufficiency[] = {'W','i','n','d','o','w','s','.','P','e','r','c','e','p','t','i','o','n','.','S','p','a','t','i','a','l','.','S','p','a','t','i','a','l','A','n','c','h','o','r','E','x','p','o','r','t','S','u','f','f','i','c','i','e','n','c','y',0};
#endif
#endif /* RUNTIMECLASS_Windows_Perception_Spatial_SpatialAnchorExportSufficiency_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */

/*
 * Class Windows.Perception.Spatial.SpatialAnchorRawCoordinateSystemAdjustedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_Perception_Spatial_SpatialAnchorRawCoordinateSystemAdjustedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_Perception_Spatial_SpatialAnchorRawCoordinateSystemAdjustedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Perception_Spatial_SpatialAnchorRawCoordinateSystemAdjustedEventArgs[] = {'W','i','n','d','o','w','s','.','P','e','r','c','e','p','t','i','o','n','.','S','p','a','t','i','a','l','.','S','p','a','t','i','a','l','A','n','c','h','o','r','R','a','w','C','o','o','r','d','i','n','a','t','e','S','y','s','t','e','m','A','d','j','u','s','t','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Perception_Spatial_SpatialAnchorRawCoordinateSystemAdjustedEventArgs[] = L"Windows.Perception.Spatial.SpatialAnchorRawCoordinateSystemAdjustedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Perception_Spatial_SpatialAnchorRawCoordinateSystemAdjustedEventArgs[] = {'W','i','n','d','o','w','s','.','P','e','r','c','e','p','t','i','o','n','.','S','p','a','t','i','a','l','.','S','p','a','t','i','a','l','A','n','c','h','o','r','R','a','w','C','o','o','r','d','i','n','a','t','e','S','y','s','t','e','m','A','d','j','u','s','t','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_Perception_Spatial_SpatialAnchorRawCoordinateSystemAdjustedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.Perception.Spatial.SpatialAnchorExporter
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifndef RUNTIMECLASS_Windows_Perception_Spatial_SpatialAnchorExporter_DEFINED
#define RUNTIMECLASS_Windows_Perception_Spatial_SpatialAnchorExporter_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Perception_Spatial_SpatialAnchorExporter[] = {'W','i','n','d','o','w','s','.','P','e','r','c','e','p','t','i','o','n','.','S','p','a','t','i','a','l','.','S','p','a','t','i','a','l','A','n','c','h','o','r','E','x','p','o','r','t','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Perception_Spatial_SpatialAnchorExporter[] = L"Windows.Perception.Spatial.SpatialAnchorExporter";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Perception_Spatial_SpatialAnchorExporter[] = {'W','i','n','d','o','w','s','.','P','e','r','c','e','p','t','i','o','n','.','S','p','a','t','i','a','l','.','S','p','a','t','i','a','l','A','n','c','h','o','r','E','x','p','o','r','t','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_Perception_Spatial_SpatialAnchorExporter_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */

/*****************************************************************************
 * IIterable<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* > interface
 */
#ifndef ____FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume, 0x89e8f1ee, 0x3a2a, 0x5b69, 0xa7,0x86, 0xcd,0xdc,0xf7,0x45,0x6a,0x3a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("89e8f1ee-3a2a-5b69-a786-cddcf7456a3a")
                IIterable<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Perception::Spatial::SpatialBoundingVolume*, ABI::Windows::Perception::Spatial::ISpatialBoundingVolume* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume, 0x89e8f1ee, 0x3a2a, 0x5b69, 0xa7,0x86, 0xcd,0xdc,0xf7,0x45,0x6a,0x3a)
#endif
#else
typedef struct __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolumeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        TrustLevel *trustLevel);

    /*** IIterable<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume **value);

    END_INTERFACE
} __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolumeVtbl;

interface __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume {
    CONST_VTBL __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolumeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* > methods ***/
#define __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_QueryInterface(__FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_AddRef(__FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_Release(__FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetIids(__FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetRuntimeClassName(__FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetTrustLevel(__FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_First(__FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,__FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_SpatialBoundingVolume IID___FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume
#define IIterable_SpatialBoundingVolumeVtbl __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolumeVtbl
#define IIterable_SpatialBoundingVolume __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume
#define IIterable_SpatialBoundingVolume_QueryInterface __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_QueryInterface
#define IIterable_SpatialBoundingVolume_AddRef __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_AddRef
#define IIterable_SpatialBoundingVolume_Release __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_Release
#define IIterable_SpatialBoundingVolume_GetIids __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetIids
#define IIterable_SpatialBoundingVolume_GetRuntimeClassName __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetRuntimeClassName
#define IIterable_SpatialBoundingVolume_GetTrustLevel __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetTrustLevel
#define IIterable_SpatialBoundingVolume_First __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* > interface
 */
#ifndef ____FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume, 0xeb8385c5, 0x0775, 0x5415, 0x8f,0x76, 0x32,0x7e,0x6e,0x38,0x8a,0xc5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("eb8385c5-0775-5415-8f76-327e6e388ac5")
                IIterator<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Perception::Spatial::SpatialBoundingVolume*, ABI::Windows::Perception::Spatial::ISpatialBoundingVolume* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume, 0xeb8385c5, 0x0775, 0x5415, 0x8f,0x76, 0x32,0x7e,0x6e,0x38,0x8a,0xc5)
#endif
#else
typedef struct __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolumeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        TrustLevel *trustLevel);

    /*** IIterator<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        UINT32 items_size,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolumeVtbl;

interface __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume {
    CONST_VTBL __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolumeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* > methods ***/
#define __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_QueryInterface(__FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_AddRef(__FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_Release(__FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetIids(__FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetRuntimeClassName(__FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetTrustLevel(__FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_get_Current(__FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_get_HasCurrent(__FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_MoveNext(__FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetMany(__FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,UINT32 items_size,__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_SpatialBoundingVolume IID___FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume
#define IIterator_SpatialBoundingVolumeVtbl __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolumeVtbl
#define IIterator_SpatialBoundingVolume __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume
#define IIterator_SpatialBoundingVolume_QueryInterface __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_QueryInterface
#define IIterator_SpatialBoundingVolume_AddRef __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_AddRef
#define IIterator_SpatialBoundingVolume_Release __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_Release
#define IIterator_SpatialBoundingVolume_GetIids __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetIids
#define IIterator_SpatialBoundingVolume_GetRuntimeClassName __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetRuntimeClassName
#define IIterator_SpatialBoundingVolume_GetTrustLevel __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetTrustLevel
#define IIterator_SpatialBoundingVolume_get_Current __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_get_Current
#define IIterator_SpatialBoundingVolume_get_HasCurrent __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_get_HasCurrent
#define IIterator_SpatialBoundingVolume_MoveNext __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_MoveNext
#define IIterator_SpatialBoundingVolume_GetMany __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus, 0x6ced54c8, 0x7689, 0x525a, 0x80,0xe1, 0x95,0x6a,0x9d,0x85,0xcd,0x83);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("6ced54c8-7689-525a-80e1-956a9d85cd83")
            IAsyncOperationCompletedHandler<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus, 0x6ced54c8, 0x7689, 0x525a, 0x80,0xe1, 0x95,0x6a,0x9d,0x85,0xcd,0x83)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatusVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus *This);

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus *This,
        __FIAsyncOperation_1_SpatialPerceptionAccessStatus *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatusVtbl;

interface __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatusVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus > methods ***/
#define __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_QueryInterface(__FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_AddRef(__FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_Release(__FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_Invoke(__FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus* This,__FIAsyncOperation_1_SpatialPerceptionAccessStatus *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_SpatialPerceptionAccessStatus IID___FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus
#define IAsyncOperationCompletedHandler_SpatialPerceptionAccessStatusVtbl __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatusVtbl
#define IAsyncOperationCompletedHandler_SpatialPerceptionAccessStatus __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus
#define IAsyncOperationCompletedHandler_SpatialPerceptionAccessStatus_QueryInterface __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_QueryInterface
#define IAsyncOperationCompletedHandler_SpatialPerceptionAccessStatus_AddRef __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_AddRef
#define IAsyncOperationCompletedHandler_SpatialPerceptionAccessStatus_Release __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_Release
#define IAsyncOperationCompletedHandler_SpatialPerceptionAccessStatus_Invoke __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus > interface
 */
#ifndef ____FIAsyncOperation_1_SpatialPerceptionAccessStatus_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_SpatialPerceptionAccessStatus_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_SpatialPerceptionAccessStatus, 0xb425d126, 0x1069, 0x563f, 0xa8,0x63, 0x44,0xa3,0x0a,0x8f,0x07,0x1d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("b425d126-1069-563f-a863-44a30a8f071d")
            IAsyncOperation<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus > : IAsyncOperation_impl<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_SpatialPerceptionAccessStatus, 0xb425d126, 0x1069, 0x563f, 0xa8,0x63, 0x44,0xa3,0x0a,0x8f,0x07,0x1d)
#endif
#else
typedef struct __FIAsyncOperation_1_SpatialPerceptionAccessStatusVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperation_1_SpatialPerceptionAccessStatus *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperation_1_SpatialPerceptionAccessStatus *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperation_1_SpatialPerceptionAccessStatus *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIAsyncOperation_1_SpatialPerceptionAccessStatus *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIAsyncOperation_1_SpatialPerceptionAccessStatus *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIAsyncOperation_1_SpatialPerceptionAccessStatus *This,
        TrustLevel *trustLevel);

    /*** IAsyncOperation<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_SpatialPerceptionAccessStatus *This,
        __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_SpatialPerceptionAccessStatus *This,
        __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_SpatialPerceptionAccessStatus *This,
        __x_ABI_CWindows_CPerception_CSpatial_CSpatialPerceptionAccessStatus *results);

    END_INTERFACE
} __FIAsyncOperation_1_SpatialPerceptionAccessStatusVtbl;

interface __FIAsyncOperation_1_SpatialPerceptionAccessStatus {
    CONST_VTBL __FIAsyncOperation_1_SpatialPerceptionAccessStatusVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_SpatialPerceptionAccessStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_SpatialPerceptionAccessStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_SpatialPerceptionAccessStatus_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_SpatialPerceptionAccessStatus_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_SpatialPerceptionAccessStatus_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_SpatialPerceptionAccessStatus_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus > methods ***/
#define __FIAsyncOperation_1_SpatialPerceptionAccessStatus_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_SpatialPerceptionAccessStatus_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_SpatialPerceptionAccessStatus_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_SpatialPerceptionAccessStatus_QueryInterface(__FIAsyncOperation_1_SpatialPerceptionAccessStatus* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_SpatialPerceptionAccessStatus_AddRef(__FIAsyncOperation_1_SpatialPerceptionAccessStatus* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_SpatialPerceptionAccessStatus_Release(__FIAsyncOperation_1_SpatialPerceptionAccessStatus* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_SpatialPerceptionAccessStatus_GetIids(__FIAsyncOperation_1_SpatialPerceptionAccessStatus* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_SpatialPerceptionAccessStatus_GetRuntimeClassName(__FIAsyncOperation_1_SpatialPerceptionAccessStatus* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_SpatialPerceptionAccessStatus_GetTrustLevel(__FIAsyncOperation_1_SpatialPerceptionAccessStatus* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus > methods ***/
static inline HRESULT __FIAsyncOperation_1_SpatialPerceptionAccessStatus_put_Completed(__FIAsyncOperation_1_SpatialPerceptionAccessStatus* This,__FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_SpatialPerceptionAccessStatus_get_Completed(__FIAsyncOperation_1_SpatialPerceptionAccessStatus* This,__FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_SpatialPerceptionAccessStatus_GetResults(__FIAsyncOperation_1_SpatialPerceptionAccessStatus* This,__x_ABI_CWindows_CPerception_CSpatial_CSpatialPerceptionAccessStatus *results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_SpatialPerceptionAccessStatus IID___FIAsyncOperation_1_SpatialPerceptionAccessStatus
#define IAsyncOperation_SpatialPerceptionAccessStatusVtbl __FIAsyncOperation_1_SpatialPerceptionAccessStatusVtbl
#define IAsyncOperation_SpatialPerceptionAccessStatus __FIAsyncOperation_1_SpatialPerceptionAccessStatus
#define IAsyncOperation_SpatialPerceptionAccessStatus_QueryInterface __FIAsyncOperation_1_SpatialPerceptionAccessStatus_QueryInterface
#define IAsyncOperation_SpatialPerceptionAccessStatus_AddRef __FIAsyncOperation_1_SpatialPerceptionAccessStatus_AddRef
#define IAsyncOperation_SpatialPerceptionAccessStatus_Release __FIAsyncOperation_1_SpatialPerceptionAccessStatus_Release
#define IAsyncOperation_SpatialPerceptionAccessStatus_GetIids __FIAsyncOperation_1_SpatialPerceptionAccessStatus_GetIids
#define IAsyncOperation_SpatialPerceptionAccessStatus_GetRuntimeClassName __FIAsyncOperation_1_SpatialPerceptionAccessStatus_GetRuntimeClassName
#define IAsyncOperation_SpatialPerceptionAccessStatus_GetTrustLevel __FIAsyncOperation_1_SpatialPerceptionAccessStatus_GetTrustLevel
#define IAsyncOperation_SpatialPerceptionAccessStatus_put_Completed __FIAsyncOperation_1_SpatialPerceptionAccessStatus_put_Completed
#define IAsyncOperation_SpatialPerceptionAccessStatus_get_Completed __FIAsyncOperation_1_SpatialPerceptionAccessStatus_get_Completed
#define IAsyncOperation_SpatialPerceptionAccessStatus_GetResults __FIAsyncOperation_1_SpatialPerceptionAccessStatus_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_SpatialPerceptionAccessStatus_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IReference<ABI::Windows::Perception::Spatial::SpatialBoundingBox > interface
 */
#ifndef ____FIReference_1_SpatialBoundingBox_INTERFACE_DEFINED__
#define ____FIReference_1_SpatialBoundingBox_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIReference_1_SpatialBoundingBox, 0xab3274d9, 0x9b82, 0x5396, 0xbb,0x00, 0xd7,0x0c,0x53,0x97,0x96,0xb3);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("ab3274d9-9b82-5396-bb00-d70c539796b3")
            IReference<ABI::Windows::Perception::Spatial::SpatialBoundingBox > : IReference_impl<ABI::Windows::Perception::Spatial::SpatialBoundingBox >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIReference_1_SpatialBoundingBox, 0xab3274d9, 0x9b82, 0x5396, 0xbb,0x00, 0xd7,0x0c,0x53,0x97,0x96,0xb3)
#endif
#else
typedef struct __FIReference_1_SpatialBoundingBoxVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIReference_1_SpatialBoundingBox *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIReference_1_SpatialBoundingBox *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIReference_1_SpatialBoundingBox *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIReference_1_SpatialBoundingBox *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIReference_1_SpatialBoundingBox *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIReference_1_SpatialBoundingBox *This,
        TrustLevel *trustLevel);

    /*** IReference<ABI::Windows::Perception::Spatial::SpatialBoundingBox > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __FIReference_1_SpatialBoundingBox *This,
        __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingBox *value);

    END_INTERFACE
} __FIReference_1_SpatialBoundingBoxVtbl;

interface __FIReference_1_SpatialBoundingBox {
    CONST_VTBL __FIReference_1_SpatialBoundingBoxVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIReference_1_SpatialBoundingBox_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIReference_1_SpatialBoundingBox_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIReference_1_SpatialBoundingBox_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIReference_1_SpatialBoundingBox_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIReference_1_SpatialBoundingBox_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIReference_1_SpatialBoundingBox_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IReference<ABI::Windows::Perception::Spatial::SpatialBoundingBox > methods ***/
#define __FIReference_1_SpatialBoundingBox_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIReference_1_SpatialBoundingBox_QueryInterface(__FIReference_1_SpatialBoundingBox* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIReference_1_SpatialBoundingBox_AddRef(__FIReference_1_SpatialBoundingBox* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIReference_1_SpatialBoundingBox_Release(__FIReference_1_SpatialBoundingBox* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIReference_1_SpatialBoundingBox_GetIids(__FIReference_1_SpatialBoundingBox* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIReference_1_SpatialBoundingBox_GetRuntimeClassName(__FIReference_1_SpatialBoundingBox* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIReference_1_SpatialBoundingBox_GetTrustLevel(__FIReference_1_SpatialBoundingBox* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IReference<ABI::Windows::Perception::Spatial::SpatialBoundingBox > methods ***/
static inline HRESULT __FIReference_1_SpatialBoundingBox_get_Value(__FIReference_1_SpatialBoundingBox* This,__x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingBox *value) {
    return This->lpVtbl->get_Value(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IReference_SpatialBoundingBox IID___FIReference_1_SpatialBoundingBox
#define IReference_SpatialBoundingBoxVtbl __FIReference_1_SpatialBoundingBoxVtbl
#define IReference_SpatialBoundingBox __FIReference_1_SpatialBoundingBox
#define IReference_SpatialBoundingBox_QueryInterface __FIReference_1_SpatialBoundingBox_QueryInterface
#define IReference_SpatialBoundingBox_AddRef __FIReference_1_SpatialBoundingBox_AddRef
#define IReference_SpatialBoundingBox_Release __FIReference_1_SpatialBoundingBox_Release
#define IReference_SpatialBoundingBox_GetIids __FIReference_1_SpatialBoundingBox_GetIids
#define IReference_SpatialBoundingBox_GetRuntimeClassName __FIReference_1_SpatialBoundingBox_GetRuntimeClassName
#define IReference_SpatialBoundingBox_GetTrustLevel __FIReference_1_SpatialBoundingBox_GetTrustLevel
#define IReference_SpatialBoundingBox_get_Value __FIReference_1_SpatialBoundingBox_get_Value
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIReference_1_SpatialBoundingBox_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IReference<ABI::Windows::Perception::Spatial::SpatialBoundingFrustum > interface
 */
#ifndef ____FIReference_1_SpatialBoundingFrustum_INTERFACE_DEFINED__
#define ____FIReference_1_SpatialBoundingFrustum_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIReference_1_SpatialBoundingFrustum, 0xf434face, 0x0c36, 0x5749, 0xa8,0xa0, 0x0b,0xb6,0xce,0x78,0xa6,0x14);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("f434face-0c36-5749-a8a0-0bb6ce78a614")
            IReference<ABI::Windows::Perception::Spatial::SpatialBoundingFrustum > : IReference_impl<ABI::Windows::Perception::Spatial::SpatialBoundingFrustum >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIReference_1_SpatialBoundingFrustum, 0xf434face, 0x0c36, 0x5749, 0xa8,0xa0, 0x0b,0xb6,0xce,0x78,0xa6,0x14)
#endif
#else
typedef struct __FIReference_1_SpatialBoundingFrustumVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIReference_1_SpatialBoundingFrustum *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIReference_1_SpatialBoundingFrustum *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIReference_1_SpatialBoundingFrustum *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIReference_1_SpatialBoundingFrustum *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIReference_1_SpatialBoundingFrustum *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIReference_1_SpatialBoundingFrustum *This,
        TrustLevel *trustLevel);

    /*** IReference<ABI::Windows::Perception::Spatial::SpatialBoundingFrustum > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __FIReference_1_SpatialBoundingFrustum *This,
        __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingFrustum *value);

    END_INTERFACE
} __FIReference_1_SpatialBoundingFrustumVtbl;

interface __FIReference_1_SpatialBoundingFrustum {
    CONST_VTBL __FIReference_1_SpatialBoundingFrustumVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIReference_1_SpatialBoundingFrustum_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIReference_1_SpatialBoundingFrustum_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIReference_1_SpatialBoundingFrustum_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIReference_1_SpatialBoundingFrustum_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIReference_1_SpatialBoundingFrustum_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIReference_1_SpatialBoundingFrustum_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IReference<ABI::Windows::Perception::Spatial::SpatialBoundingFrustum > methods ***/
#define __FIReference_1_SpatialBoundingFrustum_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIReference_1_SpatialBoundingFrustum_QueryInterface(__FIReference_1_SpatialBoundingFrustum* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIReference_1_SpatialBoundingFrustum_AddRef(__FIReference_1_SpatialBoundingFrustum* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIReference_1_SpatialBoundingFrustum_Release(__FIReference_1_SpatialBoundingFrustum* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIReference_1_SpatialBoundingFrustum_GetIids(__FIReference_1_SpatialBoundingFrustum* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIReference_1_SpatialBoundingFrustum_GetRuntimeClassName(__FIReference_1_SpatialBoundingFrustum* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIReference_1_SpatialBoundingFrustum_GetTrustLevel(__FIReference_1_SpatialBoundingFrustum* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IReference<ABI::Windows::Perception::Spatial::SpatialBoundingFrustum > methods ***/
static inline HRESULT __FIReference_1_SpatialBoundingFrustum_get_Value(__FIReference_1_SpatialBoundingFrustum* This,__x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingFrustum *value) {
    return This->lpVtbl->get_Value(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IReference_SpatialBoundingFrustum IID___FIReference_1_SpatialBoundingFrustum
#define IReference_SpatialBoundingFrustumVtbl __FIReference_1_SpatialBoundingFrustumVtbl
#define IReference_SpatialBoundingFrustum __FIReference_1_SpatialBoundingFrustum
#define IReference_SpatialBoundingFrustum_QueryInterface __FIReference_1_SpatialBoundingFrustum_QueryInterface
#define IReference_SpatialBoundingFrustum_AddRef __FIReference_1_SpatialBoundingFrustum_AddRef
#define IReference_SpatialBoundingFrustum_Release __FIReference_1_SpatialBoundingFrustum_Release
#define IReference_SpatialBoundingFrustum_GetIids __FIReference_1_SpatialBoundingFrustum_GetIids
#define IReference_SpatialBoundingFrustum_GetRuntimeClassName __FIReference_1_SpatialBoundingFrustum_GetRuntimeClassName
#define IReference_SpatialBoundingFrustum_GetTrustLevel __FIReference_1_SpatialBoundingFrustum_GetTrustLevel
#define IReference_SpatialBoundingFrustum_get_Value __FIReference_1_SpatialBoundingFrustum_get_Value
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIReference_1_SpatialBoundingFrustum_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IReference<ABI::Windows::Perception::Spatial::SpatialBoundingOrientedBox > interface
 */
#ifndef ____FIReference_1_SpatialBoundingOrientedBox_INTERFACE_DEFINED__
#define ____FIReference_1_SpatialBoundingOrientedBox_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIReference_1_SpatialBoundingOrientedBox, 0x09f88309, 0x9f81, 0x5207, 0xbd,0xb2, 0xab,0xef,0x92,0x6d,0xb1,0x8f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("09f88309-9f81-5207-bdb2-abef926db18f")
            IReference<ABI::Windows::Perception::Spatial::SpatialBoundingOrientedBox > : IReference_impl<ABI::Windows::Perception::Spatial::SpatialBoundingOrientedBox >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIReference_1_SpatialBoundingOrientedBox, 0x09f88309, 0x9f81, 0x5207, 0xbd,0xb2, 0xab,0xef,0x92,0x6d,0xb1,0x8f)
#endif
#else
typedef struct __FIReference_1_SpatialBoundingOrientedBoxVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIReference_1_SpatialBoundingOrientedBox *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIReference_1_SpatialBoundingOrientedBox *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIReference_1_SpatialBoundingOrientedBox *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIReference_1_SpatialBoundingOrientedBox *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIReference_1_SpatialBoundingOrientedBox *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIReference_1_SpatialBoundingOrientedBox *This,
        TrustLevel *trustLevel);

    /*** IReference<ABI::Windows::Perception::Spatial::SpatialBoundingOrientedBox > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __FIReference_1_SpatialBoundingOrientedBox *This,
        __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingOrientedBox *value);

    END_INTERFACE
} __FIReference_1_SpatialBoundingOrientedBoxVtbl;

interface __FIReference_1_SpatialBoundingOrientedBox {
    CONST_VTBL __FIReference_1_SpatialBoundingOrientedBoxVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIReference_1_SpatialBoundingOrientedBox_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIReference_1_SpatialBoundingOrientedBox_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIReference_1_SpatialBoundingOrientedBox_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIReference_1_SpatialBoundingOrientedBox_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIReference_1_SpatialBoundingOrientedBox_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIReference_1_SpatialBoundingOrientedBox_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IReference<ABI::Windows::Perception::Spatial::SpatialBoundingOrientedBox > methods ***/
#define __FIReference_1_SpatialBoundingOrientedBox_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIReference_1_SpatialBoundingOrientedBox_QueryInterface(__FIReference_1_SpatialBoundingOrientedBox* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIReference_1_SpatialBoundingOrientedBox_AddRef(__FIReference_1_SpatialBoundingOrientedBox* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIReference_1_SpatialBoundingOrientedBox_Release(__FIReference_1_SpatialBoundingOrientedBox* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIReference_1_SpatialBoundingOrientedBox_GetIids(__FIReference_1_SpatialBoundingOrientedBox* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIReference_1_SpatialBoundingOrientedBox_GetRuntimeClassName(__FIReference_1_SpatialBoundingOrientedBox* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIReference_1_SpatialBoundingOrientedBox_GetTrustLevel(__FIReference_1_SpatialBoundingOrientedBox* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IReference<ABI::Windows::Perception::Spatial::SpatialBoundingOrientedBox > methods ***/
static inline HRESULT __FIReference_1_SpatialBoundingOrientedBox_get_Value(__FIReference_1_SpatialBoundingOrientedBox* This,__x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingOrientedBox *value) {
    return This->lpVtbl->get_Value(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IReference_SpatialBoundingOrientedBox IID___FIReference_1_SpatialBoundingOrientedBox
#define IReference_SpatialBoundingOrientedBoxVtbl __FIReference_1_SpatialBoundingOrientedBoxVtbl
#define IReference_SpatialBoundingOrientedBox __FIReference_1_SpatialBoundingOrientedBox
#define IReference_SpatialBoundingOrientedBox_QueryInterface __FIReference_1_SpatialBoundingOrientedBox_QueryInterface
#define IReference_SpatialBoundingOrientedBox_AddRef __FIReference_1_SpatialBoundingOrientedBox_AddRef
#define IReference_SpatialBoundingOrientedBox_Release __FIReference_1_SpatialBoundingOrientedBox_Release
#define IReference_SpatialBoundingOrientedBox_GetIids __FIReference_1_SpatialBoundingOrientedBox_GetIids
#define IReference_SpatialBoundingOrientedBox_GetRuntimeClassName __FIReference_1_SpatialBoundingOrientedBox_GetRuntimeClassName
#define IReference_SpatialBoundingOrientedBox_GetTrustLevel __FIReference_1_SpatialBoundingOrientedBox_GetTrustLevel
#define IReference_SpatialBoundingOrientedBox_get_Value __FIReference_1_SpatialBoundingOrientedBox_get_Value
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIReference_1_SpatialBoundingOrientedBox_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::Perception::Spatial::SpatialAnchor*,ABI::Windows::Perception::Spatial::SpatialAnchorRawCoordinateSystemAdjustedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs, 0xfa43f9e4, 0x3558, 0x59c8, 0x9a,0x77, 0x6e,0x8b,0x76,0x5a,0xdc,0xc8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("fa43f9e4-3558-59c8-9a77-6e8b765adcc8")
            ITypedEventHandler<ABI::Windows::Perception::Spatial::SpatialAnchor*,ABI::Windows::Perception::Spatial::SpatialAnchorRawCoordinateSystemAdjustedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Perception::Spatial::SpatialAnchor*, ABI::Windows::Perception::Spatial::ISpatialAnchor* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Perception::Spatial::SpatialAnchorRawCoordinateSystemAdjustedEventArgs*, ABI::Windows::Perception::Spatial::ISpatialAnchorRawCoordinateSystemAdjustedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs, 0xfa43f9e4, 0x3558, 0x59c8, 0x9a,0x77, 0x6e,0x8b,0x76,0x5a,0xdc,0xc8)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs *This);

    /*** ITypedEventHandler<ABI::Windows::Perception::Spatial::SpatialAnchor*,ABI::Windows::Perception::Spatial::SpatialAnchorRawCoordinateSystemAdjustedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor *sender,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::Perception::Spatial::SpatialAnchor*,ABI::Windows::Perception::Spatial::SpatialAnchorRawCoordinateSystemAdjustedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs_Release(__FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::Perception::Spatial::SpatialAnchor*,ABI::Windows::Perception::Spatial::SpatialAnchorRawCoordinateSystemAdjustedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchor *sender,__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorRawCoordinateSystemAdjustedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_SpatialAnchor_SpatialAnchorRawCoordinateSystemAdjustedEventArgs IID___FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs
#define ITypedEventHandler_SpatialAnchor_SpatialAnchorRawCoordinateSystemAdjustedEventArgsVtbl __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgsVtbl
#define ITypedEventHandler_SpatialAnchor_SpatialAnchorRawCoordinateSystemAdjustedEventArgs __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs
#define ITypedEventHandler_SpatialAnchor_SpatialAnchorRawCoordinateSystemAdjustedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs_QueryInterface
#define ITypedEventHandler_SpatialAnchor_SpatialAnchorRawCoordinateSystemAdjustedEventArgs_AddRef __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs_AddRef
#define ITypedEventHandler_SpatialAnchor_SpatialAnchorRawCoordinateSystemAdjustedEventArgs_Release __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs_Release
#define ITypedEventHandler_SpatialAnchor_SpatialAnchorRawCoordinateSystemAdjustedEventArgs_Invoke __FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CPerception__CSpatial__CSpatialAnchor_Windows__CPerception__CSpatial__CSpatialAnchorRawCoordinateSystemAdjustedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Perception::Spatial::SpatialAnchorExportSufficiency* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency, 0x4b6593d2, 0x11a8, 0x513e, 0x83,0x8d, 0x42,0x26,0xfb,0x1e,0x3c,0x1f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("4b6593d2-11a8-513e-838d-4226fb1e3c1f")
            IAsyncOperationCompletedHandler<ABI::Windows::Perception::Spatial::SpatialAnchorExportSufficiency* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Perception::Spatial::SpatialAnchorExportSufficiency*, ABI::Windows::Perception::Spatial::ISpatialAnchorExportSufficiency* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency, 0x4b6593d2, 0x11a8, 0x513e, 0x83,0x8d, 0x42,0x26,0xfb,0x1e,0x3c,0x1f)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiencyVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency *This);

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Perception::Spatial::SpatialAnchorExportSufficiency* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency *This,
        __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiencyVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiencyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Perception::Spatial::SpatialAnchorExportSufficiency* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_Release(__FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Perception::Spatial::SpatialAnchorExportSufficiency* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency* This,__FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_SpatialAnchorExportSufficiency IID___FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency
#define IAsyncOperationCompletedHandler_SpatialAnchorExportSufficiencyVtbl __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiencyVtbl
#define IAsyncOperationCompletedHandler_SpatialAnchorExportSufficiency __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency
#define IAsyncOperationCompletedHandler_SpatialAnchorExportSufficiency_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_QueryInterface
#define IAsyncOperationCompletedHandler_SpatialAnchorExportSufficiency_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_AddRef
#define IAsyncOperationCompletedHandler_SpatialAnchorExportSufficiency_Release __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_Release
#define IAsyncOperationCompletedHandler_SpatialAnchorExportSufficiency_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Perception::Spatial::SpatialAnchorExportSufficiency* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency, 0x260957b8, 0x5b76, 0x5159, 0x8d,0xc5, 0xe0,0x3d,0x74,0xaa,0x5f,0x3d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("260957b8-5b76-5159-8dc5-e03d74aa5f3d")
            IAsyncOperation<ABI::Windows::Perception::Spatial::SpatialAnchorExportSufficiency* > : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Perception::Spatial::SpatialAnchorExportSufficiency*, ABI::Windows::Perception::Spatial::ISpatialAnchorExportSufficiency* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency, 0x260957b8, 0x5b76, 0x5159, 0x8d,0xc5, 0xe0,0x3d,0x74,0xaa,0x5f,0x3d)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiencyVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency *This,
        TrustLevel *trustLevel);

    /*** IAsyncOperation<ABI::Windows::Perception::Spatial::SpatialAnchorExportSufficiency* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiencyVtbl;

interface __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency {
    CONST_VTBL __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiencyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Perception::Spatial::SpatialAnchorExportSufficiency* > methods ***/
#define __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_QueryInterface(__FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_AddRef(__FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_Release(__FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_GetIids(__FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_GetTrustLevel(__FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Perception::Spatial::SpatialAnchorExportSufficiency* > methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_put_Completed(__FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency* This,__FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_get_Completed(__FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency* This,__FIAsyncOperationCompletedHandler_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_GetResults(__FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialAnchorExportSufficiency **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_SpatialAnchorExportSufficiency IID___FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency
#define IAsyncOperation_SpatialAnchorExportSufficiencyVtbl __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiencyVtbl
#define IAsyncOperation_SpatialAnchorExportSufficiency __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency
#define IAsyncOperation_SpatialAnchorExportSufficiency_QueryInterface __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_QueryInterface
#define IAsyncOperation_SpatialAnchorExportSufficiency_AddRef __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_AddRef
#define IAsyncOperation_SpatialAnchorExportSufficiency_Release __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_Release
#define IAsyncOperation_SpatialAnchorExportSufficiency_GetIids __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_GetIids
#define IAsyncOperation_SpatialAnchorExportSufficiency_GetRuntimeClassName __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_GetRuntimeClassName
#define IAsyncOperation_SpatialAnchorExportSufficiency_GetTrustLevel __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_GetTrustLevel
#define IAsyncOperation_SpatialAnchorExportSufficiency_put_Completed __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_put_Completed
#define IAsyncOperation_SpatialAnchorExportSufficiency_get_Completed __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_get_Completed
#define IAsyncOperation_SpatialAnchorExportSufficiency_GetResults __FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CPerception__CSpatial__CSpatialAnchorExportSufficiency_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_perception_spatial_h__ */
