/*
 * Copyright (C) 2011 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.
 */

/** @file rs_object.rsh
 *  \brief Object routines
 *
 *
 */

#ifndef __RS_OBJECT_RSH__
#define __RS_OBJECT_RSH__


/**
 * Copy reference to the specified object.
 *
 * @param dst
 * @param src
 */
extern void __attribute__((overloadable))
    rsSetObject(rs_element *dst, rs_element src);
/**
 * \overload
 */
extern void __attribute__((overloadable))
    rsSetObject(rs_type *dst, rs_type src);
/**
 * \overload
 */
extern void __attribute__((overloadable))
    rsSetObject(rs_allocation *dst, rs_allocation src);
/**
 * \overload
 */
extern void __attribute__((overloadable))
    rsSetObject(rs_sampler *dst, rs_sampler src);
/**
 * \overload
 */
extern void __attribute__((overloadable))
    rsSetObject(rs_script *dst, rs_script src);

#ifndef __LP64__
/**
 * \overload
 */
extern void __attribute__((overloadable))
    rsSetObject(rs_path *dst, rs_path src);
/**
 * \overload
 */
extern void __attribute__((overloadable))
    rsSetObject(rs_mesh *dst, rs_mesh src);
/**
 * \overload
 */
extern void __attribute__((overloadable))
    rsSetObject(rs_program_fragment *dst, rs_program_fragment src);
/**
 * \overload
 */
extern void __attribute__((overloadable))
    rsSetObject(rs_program_vertex *dst, rs_program_vertex src);
/**
 * \overload
 */
extern void __attribute__((overloadable))
    rsSetObject(rs_program_raster *dst, rs_program_raster src);
/**
 * \overload
 */
extern void __attribute__((overloadable))
    rsSetObject(rs_program_store *dst, rs_program_store src);
/**
 * \overload
 */
extern void __attribute__((overloadable))
    rsSetObject(rs_font *dst, rs_font src);
#endif //__LP64__

/**
 * Sets the object to NULL.
 *
 * @return bool
 */
extern void __attribute__((overloadable))
    rsClearObject(rs_element *dst);
/**
 * \overload
 */
extern void __attribute__((overloadable))
    rsClearObject(rs_type *dst);
/**
 * \overload
 */
extern void __attribute__((overloadable))
    rsClearObject(rs_allocation *dst);
/**
 * \overload
 */
extern void __attribute__((overloadable))
    rsClearObject(rs_sampler *dst);
/**
 * \overload
 */
extern void __attribute__((overloadable))
    rsClearObject(rs_script *dst);


#ifndef __LP64__
/**
 * \overload
 */
extern void __attribute__((overloadable))
    rsClearObject(rs_path *dst);
/**
 * \overload
 */
extern void __attribute__((overloadable))
    rsClearObject(rs_mesh *dst);
/**
 * \overload
 */
extern void __attribute__((overloadable))
    rsClearObject(rs_program_fragment *dst);
/**
 * \overload
 */
extern void __attribute__((overloadable))
    rsClearObject(rs_program_vertex *dst);
/**
 * \overload
 */
extern void __attribute__((overloadable))
    rsClearObject(rs_program_raster *dst);
/**
 * \overload
 */
extern void __attribute__((overloadable))
    rsClearObject(rs_program_store *dst);
/**
 * \overload
 */
extern void __attribute__((overloadable))
    rsClearObject(rs_font *dst);
#endif //__LP64__


/**
 * Tests if the object is valid.  Returns true if the object is valid, false if
 * it is NULL.
 *
 * @return bool
 */
extern bool __attribute__((overloadable))
    rsIsObject(rs_element);
/**
 * \overload
 */
extern bool __attribute__((overloadable))
    rsIsObject(rs_type);
/**
 * \overload
 */
extern bool __attribute__((overloadable))
    rsIsObject(rs_allocation);
/**
 * \overload
 */
extern bool __attribute__((overloadable))
    rsIsObject(rs_sampler);
/**
 * \overload
 */
extern bool __attribute__((overloadable))
    rsIsObject(rs_script);

#ifndef __LP64__
/**
 * \overload
 */
extern bool __attribute__((overloadable))
    rsIsObject(rs_path);
/**
 * \overload
 */
extern bool __attribute__((overloadable))
    rsIsObject(rs_mesh);
/**
 * \overload
 */
extern bool __attribute__((overloadable))
    rsIsObject(rs_program_fragment);
/**
 * \overload
 */
extern bool __attribute__((overloadable))
    rsIsObject(rs_program_vertex);
/**
 * \overload
 */
extern bool __attribute__((overloadable))
    rsIsObject(rs_program_raster);
/**
 * \overload
 */
extern bool __attribute__((overloadable))
    rsIsObject(rs_program_store);
/**
 * \overload
 */
extern bool __attribute__((overloadable))
    rsIsObject(rs_font);
#endif //__LP64__

#endif
