Skip to content

Commit

Permalink
add missing enum list methods
Browse files Browse the repository at this point in the history
  • Loading branch information
jmckaskill committed Nov 10, 2013
1 parent c1ef259 commit 28c0f19
Show file tree
Hide file tree
Showing 3 changed files with 173 additions and 54 deletions.
188 changes: 144 additions & 44 deletions capn.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,78 +139,78 @@ func (s *Segment) NewData(v []byte) Object {
return n
}

func (s *Segment) NewPointerList(length int) (PointerList, error) {
n, err := s.create(length*8, Object{typ: TypePointerList, length: length, ptrs: 1})
return PointerList(n), err
func (s *Segment) NewPointerList(length int) PointerList {
n, _ := s.create(length*8, Object{typ: TypePointerList, length: length, ptrs: 1})
return PointerList(n)
}

func (s *Segment) NewTextList(length int) (TextList, error) {
n, err := s.create(length*8, Object{typ: TypePointerList, length: length, ptrs: 1})
return TextList(n), err
func (s *Segment) NewTextList(length int) TextList {
n, _ := s.create(length*8, Object{typ: TypePointerList, length: length, ptrs: 1})
return TextList(n)
}

func (s *Segment) NewDataList(length int) (DataList, error) {
n, err := s.create(length*8, Object{typ: TypePointerList, length: length, ptrs: 1})
return DataList(n), err
func (s *Segment) NewDataList(length int) DataList {
n, _ := s.create(length*8, Object{typ: TypePointerList, length: length, ptrs: 1})
return DataList(n)
}

func (s *Segment) NewVoidList(length int) (VoidList, error) {
return VoidList{typ: TypeList, length: length, datasz: 0}, nil
func (s *Segment) NewVoidList(length int) VoidList {
return VoidList{typ: TypeList, length: length, datasz: 0}
}

func (s *Segment) NewBitList(length int) (BitList, error) {
n, err := s.create((length+63)/8, Object{typ: TypeBitList, length: length})
return BitList(n), err
func (s *Segment) NewBitList(length int) BitList {
n, _ := s.create((length+63)/8, Object{typ: TypeBitList, length: length})
return BitList(n)
}

func (s *Segment) NewInt8List(length int) (Int8List, error) {
n, err := s.create(length, Object{typ: TypeList, length: length, datasz: 1})
return Int8List(n), err
func (s *Segment) NewInt8List(length int) Int8List {
n, _ := s.create(length, Object{typ: TypeList, length: length, datasz: 1})
return Int8List(n)
}

func (s *Segment) NewUInt8List(length int) (UInt8List, error) {
n, err := s.create(length, Object{typ: TypeList, length: length, datasz: 1})
return UInt8List(n), err
func (s *Segment) NewUInt8List(length int) UInt8List {
n, _ := s.create(length, Object{typ: TypeList, length: length, datasz: 1})
return UInt8List(n)
}

func (s *Segment) NewInt16List(length int) (Int16List, error) {
n, err := s.create(2*length, Object{typ: TypeList, length: length, datasz: 2})
return Int16List(n), err
func (s *Segment) NewInt16List(length int) Int16List {
n, _ := s.create(2*length, Object{typ: TypeList, length: length, datasz: 2})
return Int16List(n)
}

func (s *Segment) NewUInt16List(length int) (UInt16List, error) {
n, err := s.create(2*length, Object{typ: TypeList, length: length, datasz: 2})
return UInt16List(n), err
func (s *Segment) NewUInt16List(length int) UInt16List {
n, _ := s.create(2*length, Object{typ: TypeList, length: length, datasz: 2})
return UInt16List(n)
}

func (s *Segment) NewInt32List(length int) (Int32List, error) {
n, err := s.create(4*length, Object{typ: TypeList, length: length, datasz: 4})
return Int32List(n), err
func (s *Segment) NewInt32List(length int) Int32List {
n, _ := s.create(4*length, Object{typ: TypeList, length: length, datasz: 4})
return Int32List(n)
}

func (s *Segment) NewUInt32List(length int) (UInt32List, error) {
n, err := s.create(4*length, Object{typ: TypeList, length: length, datasz: 4})
return UInt32List(n), err
func (s *Segment) NewUInt32List(length int) UInt32List {
n, _ := s.create(4*length, Object{typ: TypeList, length: length, datasz: 4})
return UInt32List(n)
}

func (s *Segment) NewFloat32List(length int) (Float32List, error) {
n, err := s.create(4*length, Object{typ: TypeList, length: length, datasz: 4})
return Float32List(n), err
func (s *Segment) NewFloat32List(length int) Float32List {
n, _ := s.create(4*length, Object{typ: TypeList, length: length, datasz: 4})
return Float32List(n)
}

func (s *Segment) NewInt64List(length int) (Int64List, error) {
n, err := s.create(8*length, Object{typ: TypeList, length: length, datasz: 8})
return Int64List(n), err
func (s *Segment) NewInt64List(length int) Int64List {
n, _ := s.create(8*length, Object{typ: TypeList, length: length, datasz: 8})
return Int64List(n)
}

func (s *Segment) NewUInt64List(length int) (UInt64List, error) {
n, err := s.create(8*length, Object{typ: TypeList, length: length, datasz: 8})
return UInt64List(n), err
func (s *Segment) NewUInt64List(length int) UInt64List {
n, _ := s.create(8*length, Object{typ: TypeList, length: length, datasz: 8})
return UInt64List(n)
}

func (s *Segment) NewFloat64List(length int) (Float64List, error) {
n, err := s.create(8*length, Object{typ: TypeList, length: length, datasz: 8})
return Float64List(n), err
func (s *Segment) NewFloat64List(length int) Float64List {
n, _ := s.create(8*length, Object{typ: TypeList, length: length, datasz: 8})
return Float64List(n)
}

func (s *Segment) NewCompositeList(datasz, ptrs, length int) PointerList {
Expand Down Expand Up @@ -610,6 +610,106 @@ func (p UInt64List) Set(i int, v uint64) {
}
}

func (p BitList) ToArray() []bool {
v := make([]bool, p.Len())
for i := range v {
v[i] = p.At(i)
}
return v
}

func (p UInt8List) ToArray() []uint8 {
if p.typ == TypeList && p.datasz == 1 && p.ptrs == 0 {
return p.Segment.Data[p.off:p.off + p.length]
}

v := make([]uint8, p.Len())
for i := range v {
v[i] = p.At(i)
}
return v
}

func (p Int8List) ToArray() []int8 {
v := make([]int8, p.Len())
for i := range v {
v[i] = p.At(i)
}
return v
}

func (p UInt16List) ToArray() []uint16 {
v := make([]uint16, p.Len())
for i := range v {
v[i] = p.At(i)
}
return v
}

func (p UInt16List) ToEnumArray() *[]uint16 {
v := make([]uint16, p.Len())
for i := range v {
v[i] = p.At(i)
}
return &v
}

func (p Int16List) ToArray() []int16 {
v := make([]int16, p.Len())
for i := range v {
v[i] = p.At(i)
}
return v
}

func (p UInt32List) ToArray() []uint32 {
v := make([]uint32, p.Len())
for i := range v {
v[i] = p.At(i)
}
return v
}

func (p Float32List) ToArray() []float32 {
v := make([]float32, p.Len())
for i := range v {
v[i] = p.At(i)
}
return v
}

func (p Int32List) ToArray() []int32 {
v := make([]int32, p.Len())
for i := range v {
v[i] = p.At(i)
}
return v
}

func (p Int64List) ToArray() []int64 {
v := make([]int64, p.Len())
for i := range v {
v[i] = p.At(i)
}
return v
}

func (p Float64List) ToArray() []float64 {
v := make([]float64, p.Len())
for i := range v {
v[i] = p.At(i)
}
return v
}

func (p UInt64List) ToArray() []uint64 {
v := make([]uint64, p.Len())
for i := range v {
v[i] = p.At(i)
}
return v
}

func (p TextList) ToArray() []string {
v := make([]string, p.Len())
for i := range v {
Expand Down
28 changes: 18 additions & 10 deletions capnpc-go/capnpc-go.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ var (
)

var g_nodes = make(map[uint64]*node)
var g_imported map[string]struct{}
var g_imported map[string]bool
var g_segment *C.Segment
var g_bufname string

Expand Down Expand Up @@ -61,7 +61,7 @@ func (n *node) remoteScope(from *node) string {
if n.imp == from.imp {
return ""
} else {
g_imported[n.imp] = struct{}{}
g_imported[n.imp] = true
return n.pkg + "."
}
}
Expand Down Expand Up @@ -124,6 +124,14 @@ func (n *node) defineEnum(w io.Writer) {

fprintf(w, ")\n")
}

fprintf(w, "type %s_List C.PointerList\n", n.name)
fprintf(w, "func New%sList(s *C.Segment, sz int) %s_List { return %s_List(s.NewUInt16List(sz)) }\n", n.name, n.name, n.name)
fprintf(w, "func (s %s_List) Len() int { return C.UInt16List(s).Len() }\n", n.name)
fprintf(w, "func (s %s_List) At(i int) %s { return %s(C.UInt16List(s).At(i)) }\n", n.name, n.name, n.name)
fprintf(w, "func (s %s_List) ToArray() []%s { return *(*[]%s)(unsafe.Pointer(C.UInt16List(s).ToEnumArray())) }\n", n.name, n.name, n.name)

g_imported["unsafe"] = true
}

func (n *node) writeValue(w io.Writer, t Type, v Value) {
Expand Down Expand Up @@ -174,12 +182,12 @@ func (n *node) writeValue(w io.Writer, t Type, v Value) {
case TYPE_FLOAT32:
assert(v.which() == VALUE_FLOAT32, "expected float32 value")
fprintf(w, "math.Float32frombits(0x%x)", math.Float32bits(v.Float32()))
g_imported["math"] = struct{}{}
g_imported["math"] = true

case TYPE_FLOAT64:
assert(v.which() == VALUE_FLOAT64, "expected float64 value")
fprintf(w, "math.Float64frombits(0x%x)", math.Float64bits(v.Float64()))
g_imported["math"] = struct{}{}
g_imported["math"] = true

case TYPE_TEXT:
assert(v.which() == VALUE_TEXT, "expected text value")
Expand Down Expand Up @@ -220,7 +228,7 @@ func (n *node) writeValue(w io.Writer, t Type, v Value) {
case TYPE_VOID, TYPE_INTERFACE:
fprintf(w, "make([]C.Void, %d)", v.List().ToVoidList().Len())
case TYPE_BOOL:
fprintf(w, "C.List1(%s.Root(%d))", g_bufname, copyData(v.List()))
fprintf(w, "C.BitList(%s.Root(%d))", g_bufname, copyData(v.List()))
case TYPE_INT8:
fprintf(w, "C.Int8List(%s.Root(%d))", g_bufname, copyData(v.List()))
case TYPE_UINT8:
Expand Down Expand Up @@ -428,7 +436,7 @@ func (n *node) defineField(w io.Writer, f Field) {
fprintf(&g, "float32 { return math.Float32frombits(C.Struct(s).Get32(%d)) }\n", off*4)
fprintf(&s, "(v float32) {%s C.Struct(s).Set32(%d, math.Float32bits(v)) }\n", settag, off*4)
}
g_imported["math"] = struct{}{}
g_imported["math"] = true

case TYPE_FLOAT64:
assert(def.which() == VALUE_VOID || def.which() == VALUE_FLOAT64, "expected float64 default")
Expand All @@ -439,7 +447,7 @@ func (n *node) defineField(w io.Writer, f Field) {
fprintf(&g, "float64 { return math.Float64frombits(C.Struct(s).Get64(%d)) }\n", off*8)
fprintf(&s, "(v float64) {%s C.Struct(s).Set64(%d, math.Float64bits(v)) }\n", settag, off*8)
}
g_imported["math"] = struct{}{}
g_imported["math"] = true

case TYPE_TEXT:
assert(def.which() == VALUE_VOID || def.which() == VALUE_TEXT, "expected text default")
Expand Down Expand Up @@ -509,7 +517,7 @@ func (n *node) defineField(w io.Writer, f Field) {
case TYPE_VOID, TYPE_INTERFACE:
typ = "C.VoidList"
case TYPE_BOOL:
typ = "C.List1"
typ = "C.BitList"
case TYPE_INT8:
typ = "C.Int8List"
case TYPE_UINT8:
Expand Down Expand Up @@ -662,7 +670,7 @@ func (n *node) defineStructList(w io.Writer) {
fprintf(w, "func (s %s_List) At(i int) %s { return %s(C.PointerList(s).At(i).ToStruct()) }\n", n.name, n.name, n.name)
fprintf(w, "func (s %s_List) ToArray() []%s { return *(*[]%s)(unsafe.Pointer(C.PointerList(s).ToArray())) }\n", n.name, n.name, n.name)

g_imported["unsafe"] = struct{}{}
g_imported["unsafe"] = true
}

func main() {
Expand Down Expand Up @@ -703,7 +711,7 @@ func main() {
for _, reqf := range req.RequestedFiles().ToArray() {
f := findNode(reqf.Id())
buf := bytes.Buffer{}
g_imported = make(map[string]struct{})
g_imported = make(map[string]bool)
g_segment = C.NewBuffer([]byte{})
g_bufname = sprintf("x_%x", f.Id())

Expand Down
11 changes: 11 additions & 0 deletions capnpc-go/schema.capnp.go
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,17 @@ const (
ELEMENTSIZE_INLINECOMPOSITE = 7
)

type ElementSize_List C.PointerList

func NewElementSizeList(s *C.Segment, sz int) ElementSize_List {
return ElementSize_List(s.NewUInt16List(sz))
}
func (s ElementSize_List) Len() int { return C.UInt16List(s).Len() }
func (s ElementSize_List) At(i int) ElementSize { return ElementSize(C.UInt16List(s).At(i)) }
func (s ElementSize_List) ToArray() []ElementSize {
return *(*[]ElementSize)(unsafe.Pointer(C.UInt16List(s).ToEnumArray()))
}

type CodeGeneratorRequest C.Struct

func NewCodeGeneratorRequest(s *C.Segment) CodeGeneratorRequest {
Expand Down

0 comments on commit 28c0f19

Please sign in to comment.