001/* 002 * BridJ - Dynamic and blazing-fast native interop for Java. 003 * http://bridj.googlecode.com/ 004 * 005 * Copyright (c) 2010-2013, Olivier Chafik (http://ochafik.com/) 006 * All rights reserved. 007 * 008 * Redistribution and use in source and binary forms, with or without 009 * modification, are permitted provided that the following conditions are met: 010 * 011 * * Redistributions of source code must retain the above copyright 012 * notice, this list of conditions and the following disclaimer. 013 * * Redistributions in binary form must reproduce the above copyright 014 * notice, this list of conditions and the following disclaimer in the 015 * documentation and/or other materials provided with the distribution. 016 * * Neither the name of Olivier Chafik nor the 017 * names of its contributors may be used to endorse or promote products 018 * derived from this software without specific prior written permission. 019 * 020 * THIS SOFTWARE IS PROVIDED BY OLIVIER CHAFIK AND CONTRIBUTORS ``AS IS'' AND ANY 021 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 022 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 023 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY 024 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 025 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 026 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 027 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 028 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 029 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 030 */ 031package org.bridj; 032 033import org.bridj.ann.Constructor; 034 035/** 036 * Base class for C structs. 037 * 038 * @author Olivier 039 */ 040@org.bridj.ann.Runtime(CRuntime.class) 041public abstract class StructObject extends NativeObject { 042 043 protected StructIO io; 044 045 protected StructObject() { 046 super(); 047 } 048 049 /** 050 * Identified constructor with an arbirary number of arguments 051 * 052 * @param voidArg always null, here to disambiguate some sub-constructors 053 * @param constructorId identifier of the constructor, has to match a 054 * {@link Constructor} annotation or be -1. 055 * @param args 056 */ 057 protected StructObject(Void voidArg, int constructorId, Object... args) { 058 super(constructorId, args); 059 } 060 061 protected StructObject(Pointer<? extends StructObject> peer, Object... targs) { 062 super(peer, targs); 063 } 064 065 /** 066 * Creates a String out of this struct using BridJ.describe(this) (see {@link BridJ#describe(NativeObject) 067 * }). 068 */ 069 @Override 070 public String toString() { 071 return BridJ.describe(this); 072 } 073 074 /** 075 * Get the offset of a field in a struct. 076 */ 077 public static long offsetOfField(StructObject o, String name) { 078 for (StructFieldDescription desc : o.io.desc.fields) { 079 if (desc.name.equals(name)) { 080 return desc.byteOffset; 081 } 082 } 083 throw new NoSuchFieldError(name); 084 } 085}