/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.

/*
 * rs_object.rsh: Object routines
 *
 */
#ifndef RENDERSCRIPT_RS_OBJECT_RSH
#define RENDERSCRIPT_RS_OBJECT_RSH

/*
 * rsClearObject: For internal use.
 *
 */
extern void __attribute__((overloadable))
    rsClearObject(rs_element* dst);

extern void __attribute__((overloadable))
    rsClearObject(rs_type* dst);

extern void __attribute__((overloadable))
    rsClearObject(rs_allocation* dst);

extern void __attribute__((overloadable))
    rsClearObject(rs_sampler* dst);

extern void __attribute__((overloadable))
    rsClearObject(rs_script* dst);

#ifndef __LP64__
extern void __attribute__((overloadable))
    rsClearObject(rs_mesh* dst);
#endif

#ifndef __LP64__
extern void __attribute__((overloadable))
    rsClearObject(rs_program_fragment* dst);
#endif

#ifndef __LP64__
extern void __attribute__((overloadable))
    rsClearObject(rs_program_vertex* dst);
#endif

#ifndef __LP64__
extern void __attribute__((overloadable))
    rsClearObject(rs_program_raster* dst);
#endif

#ifndef __LP64__
extern void __attribute__((overloadable))
    rsClearObject(rs_program_store* dst);
#endif

#ifndef __LP64__
extern void __attribute__((overloadable))
    rsClearObject(rs_font* dst);
#endif

/*
 * rsIsObject: For internal use.
 *
 */
extern bool __attribute__((overloadable))
    rsIsObject(rs_element v);

extern bool __attribute__((overloadable))
    rsIsObject(rs_type v);

extern bool __attribute__((overloadable))
    rsIsObject(rs_allocation v);

extern bool __attribute__((overloadable))
    rsIsObject(rs_sampler v);

extern bool __attribute__((overloadable))
    rsIsObject(rs_script v);

#ifndef __LP64__
extern bool __attribute__((overloadable))
    rsIsObject(rs_mesh v);
#endif

#ifndef __LP64__
extern bool __attribute__((overloadable))
    rsIsObject(rs_program_fragment v);
#endif

#ifndef __LP64__
extern bool __attribute__((overloadable))
    rsIsObject(rs_program_vertex v);
#endif

#ifndef __LP64__
extern bool __attribute__((overloadable))
    rsIsObject(rs_program_raster v);
#endif

#ifndef __LP64__
extern bool __attribute__((overloadable))
    rsIsObject(rs_program_store v);
#endif

#ifndef __LP64__
extern bool __attribute__((overloadable))
    rsIsObject(rs_font v);
#endif

/*
 * rsSetObject: For internal use.
 *
 */
extern void __attribute__((overloadable))
    rsSetObject(rs_element* dst, rs_element src);

extern void __attribute__((overloadable))
    rsSetObject(rs_type* dst, rs_type src);

extern void __attribute__((overloadable))
    rsSetObject(rs_allocation* dst, rs_allocation src);

extern void __attribute__((overloadable))
    rsSetObject(rs_sampler* dst, rs_sampler src);

extern void __attribute__((overloadable))
    rsSetObject(rs_script* dst, rs_script src);

#ifndef __LP64__
extern void __attribute__((overloadable))
    rsSetObject(rs_mesh* dst, rs_mesh src);
#endif

#ifndef __LP64__
extern void __attribute__((overloadable))
    rsSetObject(rs_program_fragment* dst, rs_program_fragment src);
#endif

#ifndef __LP64__
extern void __attribute__((overloadable))
    rsSetObject(rs_program_vertex* dst, rs_program_vertex src);
#endif

#ifndef __LP64__
extern void __attribute__((overloadable))
    rsSetObject(rs_program_raster* dst, rs_program_raster src);
#endif

#ifndef __LP64__
extern void __attribute__((overloadable))
    rsSetObject(rs_program_store* dst, rs_program_store src);
#endif

#ifndef __LP64__
extern void __attribute__((overloadable))
    rsSetObject(rs_font* dst, rs_font src);
#endif

#endif // RENDERSCRIPT_RS_OBJECT_RSH
