Adapt to changes from CLOWNFISH-28 take 2.

*   Each non-inert class gets mapped to a private struct and a public
    interface.
*   WRAP* and finalize functions autogenerated.


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/85f3cd67
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/85f3cd67
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/85f3cd67

Branch: refs/heads/master
Commit: 85f3cd677bad093f4f570c38fcfc59c7a5dc96ec
Parents: 81e861c
Author: Marvin Humphrey <[email protected]>
Authored: Sat Mar 28 21:12:02 2015 -0700
Committer: Marvin Humphrey <[email protected]>
Committed: Sat Apr 4 17:51:29 2015 -0700

----------------------------------------------------------------------
 go/lucy/analysis.go          | 29 ++++++++++-----
 go/lucy/index.go             | 77 +++++++++++++++++++++++++--------------
 go/lucy/lucy_test.go         |  2 +-
 go/lucy/plan.go              | 62 +++++++++++++++++++++----------
 go/lucy/search.go            | 77 ++++++++++++++++++++++++++++-----------
 go/sample/getting_started.go |  4 +-
 6 files changed, 170 insertions(+), 81 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/85f3cd67/go/lucy/analysis.go
----------------------------------------------------------------------
diff --git a/go/lucy/analysis.go b/go/lucy/analysis.go
index 679643c..df3f341 100644
--- a/go/lucy/analysis.go
+++ b/go/lucy/analysis.go
@@ -31,28 +31,39 @@ type Analyzer interface {
        ToAnalyzerPtr() uintptr
 }
 
-type EasyAnalyzer struct {
+type implAnalyzer struct {
+       ref *C.lucy_Analyzer
+}
+
+type EasyAnalyzer interface {
+       Analyzer
+}
+
+type implEasyAnalyzer struct {
        ref *C.lucy_EasyAnalyzer
 }
 
-func NewEasyAnalyzer(language string) *EasyAnalyzer {
+func NewEasyAnalyzer(language string) EasyAnalyzer {
        lang := clownfish.NewString(language)
-       obj := &EasyAnalyzer{
-               
C.lucy_EasyAnalyzer_new((*C.cfish_String)(unsafe.Pointer(lang.ToPtr()))),
-       }
-       runtime.SetFinalizer(obj, (*EasyAnalyzer).finalize)
+       cfObj := 
C.lucy_EasyAnalyzer_new((*C.cfish_String)(unsafe.Pointer(lang.ToPtr())))
+       return WRAPEasyAnalyzer(unsafe.Pointer(cfObj))
+}
+
+func WRAPEasyAnalyzer(ptr unsafe.Pointer) EasyAnalyzer {
+       obj := &implEasyAnalyzer{(*C.lucy_EasyAnalyzer)(ptr)}
+       runtime.SetFinalizer(obj, (*implEasyAnalyzer).finalize)
        return obj
 }
 
-func (obj *EasyAnalyzer) finalize() {
+func (obj *implEasyAnalyzer) finalize() {
        C.cfish_dec_refcount(unsafe.Pointer(obj.ref))
        obj.ref = nil
 }
 
-func (obj *EasyAnalyzer) ToPtr() uintptr {
+func (obj *implEasyAnalyzer) ToPtr() uintptr {
        return uintptr(unsafe.Pointer(obj.ref))
 }
 
-func (obj *EasyAnalyzer) ToAnalyzerPtr() uintptr {
+func (obj *implEasyAnalyzer) ToAnalyzerPtr() uintptr {
        return obj.ToPtr()
 }

http://git-wip-us.apache.org/repos/asf/lucy/blob/85f3cd67/go/lucy/index.go
----------------------------------------------------------------------
diff --git a/go/lucy/index.go b/go/lucy/index.go
index 7440d8b..b72e487 100644
--- a/go/lucy/index.go
+++ b/go/lucy/index.go
@@ -34,27 +34,38 @@ import "strings"
 import "unsafe"
 import 
"git-wip-us.apache.org/repos/asf/lucy-clownfish.git/runtime/go/clownfish"
 
-type Indexer struct {
+type Indexer interface {
+       clownfish.Obj
+       Close() error
+       AddDoc(doc interface{}) error
+       Commit() error
+}
+
+type implIndexer struct {
        ref        *C.lucy_Indexer
-       fieldNames map[string]*clownfish.String
+       fieldNames map[string]clownfish.String
+}
+
+type IndexManager interface {
+       clownfish.Obj
 }
 
-type IndexManager struct {
+type implIndexManager struct {
        ref *C.lucy_IndexManager
 }
 
 type OpenIndexerArgs struct {
-       Schema   *Schema
+       Schema   Schema
        Index    interface{}
-       Manager  *IndexManager
+       Manager  IndexManager
        Create   bool
        Truncate bool
 }
 
-func OpenIndexer(args *OpenIndexerArgs) (obj *Indexer, err error) {
+func OpenIndexer(args *OpenIndexerArgs) (obj Indexer, err error) {
        var schemaC *C.lucy_Schema = nil
        if args.Schema != nil {
-               schemaC = args.Schema.ref
+               schemaC = (*C.lucy_Schema)(unsafe.Pointer(args.Schema.ToPtr()))
        }
        switch args.Index.(type) {
        case string:
@@ -64,7 +75,7 @@ func OpenIndexer(args *OpenIndexerArgs) (obj *Indexer, err 
error) {
        ixLoc := clownfish.NewString(args.Index.(string))
        var managerC *C.lucy_IndexManager = nil
        if args.Manager != nil {
-               managerC = args.Manager.ref
+               managerC = 
(*C.lucy_IndexManager)(unsafe.Pointer(args.Manager.ToPtr()))
        }
        var flags int32
        if args.Create {
@@ -74,22 +85,25 @@ func OpenIndexer(args *OpenIndexerArgs) (obj *Indexer, err 
error) {
                flags = flags | int32(C.lucy_Indexer_TRUNCATE)
        }
        err = clownfish.TrapErr(func() {
-               obj = &Indexer{
-                       C.lucy_Indexer_new(schemaC,
-                               (*C.cfish_Obj)(unsafe.Pointer(ixLoc.ToPtr())),
-                               managerC, C.int32_t(flags)),
-                       nil,
-               }
-               runtime.SetFinalizer(obj, (*Indexer).finalize)
+               cfObj := C.lucy_Indexer_new(schemaC,
+                       (*C.cfish_Obj)(unsafe.Pointer(ixLoc.ToPtr())),
+                       managerC, C.int32_t(flags))
+               obj = WRAPIndexer(unsafe.Pointer(cfObj))
        })
        return obj, err
 }
 
-func (obj *Indexer) finalize() {
+func WRAPIndexer(ptr unsafe.Pointer) Indexer {
+       obj := &implIndexer{(*C.lucy_Indexer)(ptr), nil}
+       runtime.SetFinalizer(obj, (*implIndexer).finalize)
+       return obj
+}
+
+func (obj *implIndexer) finalize() {
        obj.Close()
 }
 
-func (obj *Indexer) Close() error {
+func (obj *implIndexer) Close() error {
        // TODO: implement Close in core Lucy rather than bindings.
        if obj.ref != nil {
                C.cfish_dec_refcount(unsafe.Pointer(obj.ref))
@@ -98,7 +112,7 @@ func (obj *Indexer) Close() error {
        return nil // TODO catch errors
 }
 
-func (obj *Indexer) AddDoc(doc interface{}) error {
+func (obj *implIndexer) AddDoc(doc interface{}) error {
        stockDoc := C.LUCY_Indexer_Get_Stock_Doc(obj.ref)
        docFields := (*C.cfish_Hash)(C.LUCY_Doc_Get_Fields(stockDoc))
        C.CFISH_Hash_Clear(docFields)
@@ -116,7 +130,7 @@ func (obj *Indexer) AddDoc(doc interface{}) error {
        if docValue == (reflect.Value{}) {
                mess := fmt.Sprintf("Doc not struct pointer: %v",
                        reflect.TypeOf(doc))
-               return clownfish.NewError(mess)
+               return clownfish.NewErr(mess)
        }
        docType := docValue.Type()
 
@@ -126,7 +140,7 @@ func (obj *Indexer) AddDoc(doc interface{}) error {
                fieldC := obj.findFieldC(field)
                valueC := clownfish.NewString(value)
                C.CFISH_Hash_Store(docFields,
-                       (*C.cfish_Obj)(unsafe.Pointer(fieldC.ToPtr())),
+                       (*C.cfish_Obj)(unsafe.Pointer(fieldC)),
                        C.cfish_inc_refcount(unsafe.Pointer(valueC.ToPtr())))
        }
 
@@ -140,11 +154,11 @@ func (obj *Indexer) AddDoc(doc interface{}) error {
        return err
 }
 
-func (obj *Indexer) findFieldC(name string) *clownfish.String {
+func (obj *implIndexer) findFieldC(name string) *C.cfish_String {
        if obj.fieldNames == nil {
-               obj.fieldNames = make(map[string]*clownfish.String)
+               obj.fieldNames = make(map[string]clownfish.String)
        }
-       fieldC, ok := obj.fieldNames[name]
+       f, ok := obj.fieldNames[name]
        if !ok {
                schema := C.LUCY_Indexer_Get_Schema(obj.ref)
                fieldList := C.LUCY_Schema_All_Fields(schema)
@@ -153,16 +167,25 @@ func (obj *Indexer) findFieldC(name string) 
*clownfish.String {
                        cfString := unsafe.Pointer(C.CFISH_VA_Fetch(fieldList, 
C.uint32_t(i)))
                        field := clownfish.CFStringToGo(cfString)
                        if strings.EqualFold(name, field) {
-                               obj.fieldNames[name] = 
clownfish.NewString(field)
-                               fieldC = obj.fieldNames[name]
+                               C.cfish_inc_refcount(cfString)
+                               f = clownfish.WRAPString(cfString)
+                               obj.fieldNames[name] = f
                        }
                }
        }
-       return fieldC
+       return (*C.cfish_String)(unsafe.Pointer(f.ToPtr()))
 }
 
-func (obj *Indexer) Commit() error {
+func (obj *implIndexer) Commit() error {
        return clownfish.TrapErr(func() {
                C.LUCY_Indexer_Commit(obj.ref)
        })
 }
+
+func (obj *implIndexer) ToPtr() uintptr {
+       return uintptr(unsafe.Pointer(obj.ref))
+}
+
+func (obj *implIndexManager) ToPtr() uintptr {
+       return uintptr(unsafe.Pointer(obj.ref))
+}

http://git-wip-us.apache.org/repos/asf/lucy/blob/85f3cd67/go/lucy/lucy_test.go
----------------------------------------------------------------------
diff --git a/go/lucy/lucy_test.go b/go/lucy/lucy_test.go
index 19b13bf..e436c2a 100644
--- a/go/lucy/lucy_test.go
+++ b/go/lucy/lucy_test.go
@@ -26,7 +26,7 @@ func TestStuff(t *testing.T) {
 
 func TestOpenIndexer(t *testing.T) {
        _, err := lucy.OpenIndexer(&lucy.OpenIndexerArgs{Index: 
"notalucyindex"})
-       if _, ok := err.(*clownfish.Err); !ok {
+       if _, ok := err.(clownfish.Err); !ok {
                t.Error("Didn't catch exception opening indexer")
        }
 }

http://git-wip-us.apache.org/repos/asf/lucy/blob/85f3cd67/go/lucy/plan.go
----------------------------------------------------------------------
diff --git a/go/lucy/plan.go b/go/lucy/plan.go
index dbc9d5f..e8dff12 100644
--- a/go/lucy/plan.go
+++ b/go/lucy/plan.go
@@ -26,7 +26,12 @@ import "unsafe"
 
 import 
"git-wip-us.apache.org/repos/asf/lucy-clownfish.git/runtime/go/clownfish"
 
-type Schema struct {
+type Schema interface {
+       clownfish.Obj
+       SpecField(field string, fieldType FieldType)
+}
+
+type implSchema struct {
        ref *C.lucy_Schema
 }
 
@@ -35,49 +40,66 @@ type FieldType interface {
        ToFieldTypePtr() uintptr
 }
 
-type FullTextType struct {
+type implFieldType struct {
+       ref *C.lucy_FieldType
+}
+
+type FullTextType interface {
+       FieldType
+}
+
+type implFullTextType struct {
        ref *C.lucy_FullTextType
 }
 
-func NewSchema() *Schema {
-       obj := &Schema{
-               C.lucy_Schema_new(),
-       }
-       runtime.SetFinalizer(obj, (*Schema).finalize)
+func NewSchema() Schema {
+       cfObj := C.lucy_Schema_new()
+       return WRAPSchema(unsafe.Pointer(cfObj))
+}
+
+func WRAPSchema(ptr unsafe.Pointer) Schema {
+       obj := &implSchema{(*C.lucy_Schema)(ptr)}
+       runtime.SetFinalizer(obj, (*implSchema).finalize)
        return obj
 }
 
-func (obj *Schema) finalize() {
+func (obj *implSchema) finalize() {
        C.cfish_dec_refcount(unsafe.Pointer(obj.ref))
        obj.ref = nil
 }
 
-func (obj *Schema) SpecField(field string, fieldType FieldType) {
+func (obj *implSchema) SpecField(field string, fieldType FieldType) {
        fieldCF := clownfish.NewString(field)
        C.LUCY_Schema_Spec_Field(obj.ref,
                (*C.cfish_String)(unsafe.Pointer(fieldCF.ToPtr())),
-               (*C.lucy_FieldType)(unsafe.Pointer(fieldType.ToFieldTypePtr())))
+               (*C.lucy_FieldType)(unsafe.Pointer(fieldType.ToPtr())))
+}
+
+func (obj *implSchema) ToPtr() uintptr {
+       return uintptr(unsafe.Pointer(obj.ref))
+}
+
+func NewFullTextType(analyzer Analyzer) FullTextType {
+       cfObj := C.lucy_FullTextType_new(
+               (*C.lucy_Analyzer)(unsafe.Pointer(analyzer.ToPtr())))
+       return WRAPFullTextType(unsafe.Pointer(cfObj))
 }
 
-func NewFullTextType(analyzer Analyzer) *FullTextType {
-       obj := &FullTextType{
-               C.lucy_FullTextType_new(
-                       
(*C.lucy_Analyzer)(unsafe.Pointer(analyzer.ToAnalyzerPtr())),
-               ),
-       }
-       runtime.SetFinalizer(obj, (*FullTextType).finalize)
+func WRAPFullTextType(ptr unsafe.Pointer) FullTextType {
+       obj := &implFullTextType{(*C.lucy_FullTextType)(ptr)}
+       runtime.SetFinalizer(obj, (*implFullTextType).finalize)
        return obj
 }
 
-func (obj *FullTextType) finalize() {
+func (obj *implFullTextType) finalize() {
        C.cfish_dec_refcount(unsafe.Pointer(obj.ref))
        obj.ref = nil
 }
 
-func (obj *FullTextType) ToPtr() uintptr {
+func (obj *implFullTextType) ToPtr() uintptr {
        return uintptr(unsafe.Pointer(obj.ref))
 }
 
-func (obj *FullTextType) ToFieldTypePtr() uintptr {
+func (obj *implFullTextType) ToFieldTypePtr() uintptr {
        return obj.ToPtr()
 }

http://git-wip-us.apache.org/repos/asf/lucy/blob/85f3cd67/go/lucy/search.go
----------------------------------------------------------------------
diff --git a/go/lucy/search.go b/go/lucy/search.go
index cf3c3e6..aa68cec 100644
--- a/go/lucy/search.go
+++ b/go/lucy/search.go
@@ -40,26 +40,45 @@ type Query interface {
        ToQueryPtr() uintptr
 }
 
+type implQuery struct {
+       ref *C.lucy_Query
+}
+
 type Searcher interface {
        clownfish.Obj
        ToSearcherPtr() uintptr
-       Hits(query interface{}, offset uint32, numWanted uint32, sortSpec 
*SortSpec) (*Hits, error)
+       Hits(query interface{}, offset uint32, numWanted uint32, sortSpec 
SortSpec) (Hits, error)
+       Close() error
+}
+
+type Hits interface {
+       clownfish.Obj
+       Next(hit interface{}) bool
+       Error() error
 }
 
-type Hits struct {
+type implHits struct {
        ref *C.lucy_Hits
        err error
 }
 
-type SortSpec struct {
+type SortSpec interface {
+       clownfish.Obj
+}
+
+type implSortSpec struct {
        ref *C.lucy_SortSpec
 }
 
-type IndexSearcher struct {
+type IndexSearcher interface {
+       Searcher
+}
+
+type implIndexSearcher struct {
        ref *C.lucy_IndexSearcher
 }
 
-func OpenIndexSearcher(index interface{}) (obj *IndexSearcher, err error) {
+func OpenIndexSearcher(index interface{}) (obj IndexSearcher, err error) {
        var indexC *C.cfish_Obj
        switch index.(type) {
        case string:
@@ -69,55 +88,69 @@ func OpenIndexSearcher(index interface{}) (obj 
*IndexSearcher, err error) {
                panic("TODO: support Folder")
        }
        err = clownfish.TrapErr(func() {
-               obj = &IndexSearcher{C.lucy_IxSearcher_new(indexC)}
+               cfObj := C.lucy_IxSearcher_new(indexC)
+               obj = WRAPIndexSearcher(unsafe.Pointer(cfObj))
        })
-       runtime.SetFinalizer(obj, (*IndexSearcher).finalize)
        return obj, err
 }
 
-func (obj *IndexSearcher) finalize() {
+func WRAPIndexSearcher(ptr unsafe.Pointer) IndexSearcher {
+       obj := &implIndexSearcher{(*C.lucy_IndexSearcher)(ptr)}
+       runtime.SetFinalizer(obj, (*implIndexSearcher).finalize)
+       return obj
+}
+
+func (obj *implIndexSearcher) finalize() {
        C.cfish_dec_refcount(unsafe.Pointer(obj.ref))
        obj.ref = nil
 }
 
-func (obj *IndexSearcher) Close() error {
+func (obj *implIndexSearcher) Close() error {
        return clownfish.TrapErr(func() {
                C.LUCY_IxSearcher_Close(obj.ref)
        })
 }
 
-func (obj *IndexSearcher) ToPtr() uintptr {
+func (obj *implIndexSearcher) ToPtr() uintptr {
        return uintptr(unsafe.Pointer(obj.ref))
 }
 
-func (obj *IndexSearcher) ToSearcherPtr() uintptr {
+func (obj *implIndexSearcher) ToSearcherPtr() uintptr {
        return obj.ToPtr()
 }
 
-func (obj *IndexSearcher) Hits(query interface{}, offset uint32, numWanted 
uint32,
-       sortSpec *SortSpec) (hits *Hits, err error) {
-       var hitsC *C.lucy_Hits
+func (obj *implIndexSearcher) Hits(query interface{}, offset uint32, numWanted 
uint32,
+       sortSpec SortSpec) (hits Hits, err error) {
        var sortSpecC *C.lucy_SortSpec
        if sortSpec != nil {
-               sortSpecC = sortSpec.ref
+               sortSpecC = (*C.lucy_SortSpec)(unsafe.Pointer(sortSpec.ToPtr()))
        }
        switch query.(type) {
        case string:
                queryStringC := clownfish.NewString(query.(string))
                err = clownfish.TrapErr(func() {
-                       hitsC = C.LUCY_IxSearcher_Hits(obj.ref,
+                       hitsC := C.LUCY_IxSearcher_Hits(obj.ref,
                                
(*C.cfish_Obj)(unsafe.Pointer(queryStringC.ToPtr())),
                                C.uint32_t(offset), C.uint32_t(numWanted), 
sortSpecC)
+                       hits = WRAPHits(unsafe.Pointer(hitsC))
                })
        default:
                panic("TODO: support Query objects")
        }
-       hits = &Hits{hitsC, nil}
-       runtime.SetFinalizer(hits, (*Hits).finalize)
        return hits, err
 }
 
-func (obj *Hits) Next(hit interface{}) bool {
+func WRAPHits(ptr unsafe.Pointer) Hits {
+       obj := &implHits{(*C.lucy_Hits)(ptr), nil}
+       runtime.SetFinalizer(obj, (*implHits).finalize)
+       return obj
+}
+
+func (obj *implHits) ToPtr() uintptr {
+       return uintptr(unsafe.Pointer(obj.ref))
+}
+
+func (obj *implHits) Next(hit interface{}) bool {
        // TODO: accept a HitDoc object and populate score.
 
        // Get reflection value and type for the supplied struct.
@@ -133,7 +166,7 @@ func (obj *Hits) Next(hit interface{}) bool {
        if hitValue == (reflect.Value{}) {
                mess := fmt.Sprintf("Arg not writeable struct pointer: %v",
                        reflect.TypeOf(hit))
-               obj.err = clownfish.NewError(mess)
+               obj.err = clownfish.NewErr(mess)
                return false
        }
 
@@ -169,11 +202,11 @@ func (obj *Hits) Next(hit interface{}) bool {
        return true
 }
 
-func (obj *Hits) finalize() {
+func (obj *implHits) finalize() {
        C.cfish_dec_refcount(unsafe.Pointer(obj.ref))
        obj.ref = nil
 }
 
-func (obj *Hits) Error() error {
+func (obj *implHits) Error() error {
        return obj.err
 }

http://git-wip-us.apache.org/repos/asf/lucy/blob/85f3cd67/go/sample/getting_started.go
----------------------------------------------------------------------
diff --git a/go/sample/getting_started.go b/go/sample/getting_started.go
index fb69b74..a817b63 100644
--- a/go/sample/getting_started.go
+++ b/go/sample/getting_started.go
@@ -41,7 +41,7 @@ func main() {
        performSearch(searcher, `"fugiat nulla"`)
 }
 
-func createSchema() *lucy.Schema {
+func createSchema() lucy.Schema {
        // Create a new schema.
        schema := lucy.NewSchema()
 
@@ -84,7 +84,7 @@ var docs []MyDoc = []MyDoc{
        },
 }
 
-func indexDocuments(schema *lucy.Schema, index string) {
+func indexDocuments(schema lucy.Schema, index string) {
        indexerArgs := &lucy.OpenIndexerArgs{
                Schema:   schema,
                Index:    index,

Reply via email to