package co.paralleluniverse.fuse;
import jnr.ffi.Pointer;
import jnr.ffi.Runtime;
import jnr.ffi.Struct;
import jnr.ffi.StructLayout;
final class StructTimespec {
static final class Layout extends StructLayout {
Layout(Runtime runtime) {
super(runtime);
}
public final SignedLong tv_sec = new SignedLong();
public final SignedLong tv_nsec = new SignedLong();
}
static final Layout layout = new Layout(Runtime.getSystemRuntime());
private final Pointer p;
public StructTimespec(Pointer p) {
this.p = p;
}
public long nsec() {
return layout.tv_nsec.longValue(p);
}
public long sec() {
return layout.tv_sec.longValue(p);
}
public void set(double time) {
set(layout, p, time);
}
public void set(long sec, long nsec) {
set(layout, p, sec, nsec);
}
public void setMillis(long millis) {
set(millis / 1000L, (millis % 1000L) * 1000000L);
}
public void setSeconds(long seconds) {
set(seconds);
}
static void set(StructTimespec.Layout layout, Pointer p, double time) {
set(layout, p, (long) time, (long) (time * 1000000000d));
}
static void set(StructTimespec.Layout layout, Pointer p, long sec, long nsec) {
layout.tv_sec.set(p, sec);
layout.tv_nsec.set(p, nsec);
}
static void setMillis(StructTimespec.Layout layout, Pointer p, long millis) {
set(layout, p, millis / 1000L, (millis % 1000L) * 1000000L);
}
static void setSeconds(StructTimespec.Layout layout, Pointer p, long seconds) {
set(layout, p, seconds);
}
}