Provided by: critcl_3.1.18.1+dfsg-3_amd64 bug

NAME

       critcl::class - CriTcl Utilities: C Classes

SYNOPSIS

       package require Tcl  8.4

       package require critcl  ?3.1.6?

       package require critcl::class  ?1.1.1?

       ::critcl::class::define name script

       include path

       support code

       type name

       classconstructor body

       classdestructor body

       constructor body ?postbody?

       destructor body

       classvariable ctype name ?comment? ?constructor? ?destructor?

       classmethod name command arguments body

       classmethod name proc arguments resulttype body

       classmethod name as funname ?arg...?

       insvariable ctype name ?comment? ?constructor? ?destructor?

       method name command arguments body

       method name proc arguments resulttype body

       method name as funname ?arg...?

       method_introspection

________________________________________________________________________________________________________________

DESCRIPTION

       C  Runtime  In  Tcl,  or  CriTcl , is a system for compiling C code embedded in Tcl on the fly and either
       loading the resulting objects into Tcl for immediate use or packaging them for distribution.  Use  CriTcl
       to improve performance by rewriting in C those routines that are performance bottlenecks.

       This  document  is the reference manpage for the critcl::class package. This package provides convenience
       commands for advanced functionality built on top of the core.

       With it a user wishing to create a C level object with class and instance  commands  can  concentrate  on
       specifying the class- and instance-variables and -methods in a manner similar to a TclOO class, while all
       the necessary boilerplate around it is managed by this package.

       Its intended audience are mainly developers wishing to write Tcl packages with embedded C code.

       This package resides in the Core Package Layer of CriTcl.

       +----------------+
       |Applications    |
       | critcl         |
       | critcl::app    |
       +----------------+

       *================*
       |Core Packages   |
       | critcl         |
       | critcl::util   |
       *================*

       +----------------+
       |Support Packages|
       | stubs::*       |
       | md5, platform  |
       |  ...           |
       +----------------+

API

       ::critcl::class::define name script
              This  is  the  main  command to define a new class name, where name is the name of the Tcl command
              representing the class, i.e. the class command. The  script  provides  the  specification  of  the
              class,  i.e.  information  about  included  headers,  class-  and  instance  variables, class- and
              instance-methods, etc.  See the section Class Specification API below for the detailed list of the
              available commands and their semantics.

CLASS SPECIFICATION API

       Here we documents all class specification commands  available  inside  of  the  class  definition  script
       argument of ::critcl::class::define.

   GENERAL CONFIGURATION
       include path
              This  command  specifies  the  path  of a header file to include within the code generated for the
              class. This is separate from the support because the generated include directives will be  put  at
              the  very  beginning  of  the  generated  code.  This  is  done  to  allow the use of the imported
              declarations within the instance type, and elsewhere.

              Calls to this command are cumulative.  It is of course possible to not use this  command  at  all,
              for classes not making use of external definitions.

              The result is the empty string.

       support code
              This  command specifies supporting C code, i.e. any definitions (types, functions, etc.) needed by
              the whole class and not fitting into class- and instance-methods. The code is embedded  at  global
              level, outside of any function or other definition.

              Calls  to  this  command are cumulative.  It is of course possible to not use this command at all,
              for classes not requiring supporting code.

              The result of the command is the empty string.

       type name
              This command specifies the name of an external C type to be used  as  the  type  of  the  instance
              structure.

              Initialization  and  release  of  the  structure with the given type are the responsibility of the
              user, through constructor and destructor code fragments.

              Attention: Using this command precludes the use of  regular  class-  and  instance  variables.  It
              further precludes the use of method-introspection as well, as this make use of generated instance-
              variables.

              If  class- and/or instance-variable have to be used in conjunction with an external C type, simply
              create and use a class- or instance-variable with that type.

              The result of the command is the empty string.

   CLASS LIFETIME MANAGEMENT
       classconstructor body
              This command specifies a C code block surrounding the initialization of the class variables,  i.e.
              the fields of the class structure.  Note that allocation and release of the class structure itself
              is done by the system andf not the responsibility of the user.

              For  the initialization (and release) of a class variable it is recommended to use the constructor
              and destructor arguments of the variable's definition (See command classvariable) for this instead
              of using a separate classconstructor.

              This is an optional command. Using it more than once is allowed too and each use will add  another
              C code fragment to use during construction. I.e. multiple calls aggregate.

              The  C code blocks of multiple calls (including the constructors of classvariable definitions) are
              executed in order of specification.

              The result of the command is the empty string.

              The C code in body has access to the following environment:

              interp Pointer to the Tcl interpreter (Tcl_Interp*) the class structure will be  associated  with.
                     It enables the generation of a Tcl error message should construction fail.

              class  Pointer to the class structure to initialize.

              error  A C code label the constructor can jump to should it have to signal a construction failure.
                     It  is  the  responsibility of the constructor to release any variables already initialized
                     before jumping to this label. This also why the 'execution in order  of  specification'  is
                     documented  and  can  be relied on. It gives us the knowledge which other constructors have
                     already been run and initialized what other fields.

       classdestructor body
              This command specifies a C code block surrounding the release of the  class  variables,  i.e.  the
              fields  of the class structure.  Note that allocation and release of the class structure itself is
              done by the system and not the responsibility of the user.

              For the initialization (and release) of a class variable it is recommended to use the  constructor
              and destructor arguments of the variable's definition (See command classvariable) for this instead
              of using a separate classconstructor.

              This  is an optional command. Using it more than once is allowed too and each use will add another
              C code fragment to use during construction. I.e. multiple calls aggregate.

              The C code blocks of multiple calls (including the constructors of class variable definitions) are
              executed in order of specification.

              The result of the command is the empty string.

              The C code in body has access to the same environment as the class constructor code blocks.

   INSTANCE LIFETIME MANAGEMENT
       constructor body ?postbody?
              This command specifies a C code block surrounding the initialization of  the  instance  variables,
              i.e.  the  fields  of  the  instance  structure.  Note that allocation and release of the instance
              structure itself is done by the system and not the responsibility of the user.  On the other hand,
              if an external type was specified for the instance structure,  then  instance  variables  are  not
              possible,  and  the  system  has  no  knowledge  of  the  type's structure. In that case it is the
              responsibility of the body to allocate and free the structure itself too.

              For the initialization (and release) of  an  instance  variable  it  is  recommended  to  use  the
              constructor  and  destructor  arguments of the variable's definition (See command insvariable) for
              this instead of using a separate constructor.

              This is an optional command. Using it more than once is allowed too and each use will add  another
              C code fragment to use during construction. I.e. multiple calls aggregate.

              The  C code blocks of multiple calls (including the constructors of instance variable definitions)
              are executed in order of specification.

              The result of the command is the empty string.

              The C code in body has access to the following environment:

              interp Pointer to the Tcl interpreter (Tcl_Interp*) the  instance  structure  will  be  associated
                     with. It enables the generation of a Tcl error message should construction fail.

              instance
                     Pointer to the instance structure to initialize.

              error  A C code label the constructor can jump to should it have to signal a construction failure.
                     It  is  the  responsibility of the constructor to release any variables already initialized
                     before jumping to this label. This also why the 'execution in order  of  specification'  is
                     documented  and  can  be relied on. It gives us the knowledge which other constructors have
                     already been run and initialized what other fields.

       The C code in postbody is responsible for construction actions to be done after the primary  construction
       was  done  and  the  Tcl-level  instance  command  was  successfully created. It has access to a slightly
       different environment:

              interp Pointer to the Tcl interpreter (Tcl_Interp*) the  instance  structure  will  be  associated
                     with. It enables the generation of a Tcl error message should construction fail.

              instance
                     Pointer to the instance structure to initialize.

              cmd    The Tcl_Command token of the Tcl-level instance command.

              fqn    The fully qualified name of the instance command, stored in a Tcl_Obj*.

       destructor body
              This  command specifies a C code block surrounding the release of the instance variables, i.e. the
              fields of the instance structure.  Note that allocation and  release  of  the  instance  structure
              itself  is  done  by  the system and not the responsibility of the user.  On the other hand, if an
              external type was specified for the instance structure, then instance variables are not  possible,
              and  the system has no knowledge of the type's structure. In that case it is the responsibility of
              the body to allocate and free the structure itself too.

              For the initialization (and release) of  an  instance  variable  it  is  recommended  to  use  the
              constructor  and  destructor  arguments of the variable's definition (See command insvariable) for
              this instead of using a separate constructor.

              This is an optional command. Using it more than once is allowed too and each use will add  another
              C code fragment to use during construction. I.e. multiple calls aggregate.

              The  C code blocks of multiple calls (including the constructors of instance variable definitions)
              are executed in order of specification.

              The result of the command is the empty string.

              The C code in body has access to the following environment:

              instance
                     Pointer to the instance structure to release.

   CLASS VARIABLES AND METHODS
       classvariable ctype name ?comment? ?constructor? ?destructor?
              This command specifies a field in the class structure  of  the  class.   Multiple  fields  can  be
              specified, and are saved in the order specified.

              Attention:  Specification  of  a  class  variable  precludes the use of an external C type for the
              instance structure.

              Attention: Specification of a class variable automatically causes the definition  of  an  instance
              variable named class, pointing to the class structure.

              Beyond  the  basic  name  and C type of the new variable the definition may also contain a comment
              describing it, and C code blocks to initialize and release the variable.   These  are  effectively
              local  forms  of the commands classconstructor and classdestructor. Please read their descriptions
              for details regarding the C environment available to the code.

              The comment, if specified will be embedded into the generated C code for easier  cross-referencing
              from generated ".c" file to class specification.

       classmethod name command arguments body
              This command specifies a class method and the C code block implementing its functionality. This is
              the  first of three forms. The method is specified like a critcl::ccommand, with a fixed set of C-
              level arguments. The body has to perform everything (i.e. argument  extraction,  checking,  result
              return, and of course the actual functionality) by itself.

              For this the body has access to

              class  Pointer to the class structure.

              interp Pointer to the Tcl interpreter (Tcl_Interp*) the class structure is associated with

              objc   The number of method arguments.

              objv   The method arguments, as C array of Tcl_Obj pointers.

              The  arguments of the definition are only a human readable form of the method arguments and syntax
              and are not used in the C code, except as comments put into the generated code. Again, it  is  the
              responsibility of the body to check the number of arguments, extract them, check their types, etc.

       classmethod name proc arguments resulttype body
              This  command  specifies a class method and the C code block implementing its functionality.  This
              is the second of three forms. The method is specified like a critcl::cproc.  Contrary to the first
              variant here the arguments are computer readable, expected  to  be  in  the  same  format  as  the
              arguments  of  critcl::cproc.  The  same  is  true  for  the resulttype.  The system automatically
              generates a wrapper doing argument checking  and  conversion,  and  result  conversion,  like  for
              critcl::cproc.

              The body has access to

              class  Pointer to the class structure.

              interp Pointer to the Tcl interpreter (Tcl_Interp*) the class structure is associated with

              ...    All arguments under their specified names and C types as per their definition.

       classmethod name as funname ?arg...?
              This command specifies a class method and the C code block implementing its functionality. This is
              the third and last of three forms.

              The  class  method  is  implemented  by  the  external  function funname, i.e. a function which is
              declared outside of the class code itself, or in a support block.

              It is assumed that the first four arguments of that function represent the parameters

              class  Pointer to the class structure.

              interp Pointer to the Tcl interpreter (Tcl_Interp*) the class structure is associated with

              objc   The number of method arguments.

              objv   The method arguments, as C array of Tcl_Obj pointers.

              Any additional arguments specified will be added after these and are passed into the C code as is,
              i.e. are considered to be C expressions.

   INSTANCE VARIABLES AND METHODS
       insvariable ctype name ?comment? ?constructor? ?destructor?
              This command specifies a field in the instance structure of the class.   Multiple  fields  can  be
              specified, and are saved in the order specified.

              Attention:  Specification  of an instance variable precludes the use of an external C type for the
              instance structure.

              Attention: Specification of an  instance  variable  automatically  causes  the  definition  of  an
              instance  variable  of type Tcl_Command, and named cmd, holding the token of the instance command,
              and the definition of an instance method named destroy. This implicit instance variable is managed
              by the system.

              Beyond the basic name and C type of the new variable the definition may  also  contain  a  comment
              describing  it,  and  C code blocks to initialize and release the variable.  These are effectively
              local forms of the commands constructor and destructor. Please read their descriptions for details
              regarding the C environment available to the code.

              The comment, if specified will be embedded into the generated C code for easier  cross-referencing
              from generated ".c" file to class specification.

       method name command arguments body
              This  command  specifies  an  instance method and the C code block implementing its functionality.
              This is the first of three forms. The method is specified like a critcl::ccommand,  with  a  fixed
              set  of C-level arguments. The body has to perform everything (i.e. argument extraction, checking,
              result return, and of course the actual functionality) by itself.

              For this the body has access to

              instance
                     Pointer to the instance structure.

              interp Pointer to the Tcl interpreter (Tcl_Interp*) the instance structure is associated with

              objc   The number of method arguments.

              objv   The method arguments, as C array of Tcl_Obj pointers.

              The arguments of the definition are only a human readable form of the method arguments and  syntax
              and  are  not used in the C code, except as comments put into the generated code. Again, it is the
              responsibility of the body to check the number of arguments, extract them, check their types, etc.

       method name proc arguments resulttype body
              This command specifies an instance method and the C code  block  implementing  its  functionality.
              This  is the second of three forms. The method is specified like a critcl::cproc.  Contrary to the
              first variant here the arguments are computer readable, expected to be in the same format  as  the
              arguments  of  critcl::cproc.  The  same  is  true  for  the resulttype.  The system automatically
              generates a wrapper doing argument checking  and  conversion,  and  result  conversion,  like  for
              critcl::cproc.

              The body has access to

              instance
                     Pointer to the instance structure.

              interp Pointer to the Tcl interpreter (Tcl_Interp*) the instance structure is associated with

              ...    All arguments under their specified names and C types as per their definition.

       method name as funname ?arg...?
              This  command  specifies  an  instance method and the C code block implementing its functionality.
              This is the third and last of three forms.

              The instance method is implemented by the external function funname,  i.e.  a  function  which  is
              declared outside of the instance code itself, or in a support block.

              It is assumed that the first four arguments of that function represent the parameters

              instance
                     Pointer to the instance structure.

              interp Pointer to the Tcl interpreter (Tcl_Interp*) the instance structure is associated with

              objc   The number of method arguments.

              objv   The method arguments, as C array of Tcl_Obj pointers.

              Any additional arguments specified will be added after these and are passed into the C code as is,
              i.e. are considered to be C expressions.

       method_introspection
              This  command generates one class- and one instance-method both of which will return a list of the
              instance methods of the class, and  supporting  structures,  like  the  function  to  compute  the
              information, and a class variable caching it.

              The two methods and the class variable are all named methods.

   CONTEXT DEPENDENT INTERACTIONS
       This  section  documents the various interactions between the specification commands. While these are are
       all documented with the individual commands here they are pulled together to see at a glance.

       [1]    If you are using the command type to specify an external C type to use for the instance  structure
              you are subject to the following constraints and rules:

              [1]    You cannot define your own instance variables.

              [2]    You cannot define your own class variables.

              [3]    You cannot use method_introspection.

              [4]    You  have  to  allocate and release the instance structure on your own, through constructor
                     and destructor code blocks.

       [2]    If you declare class variables you are subject to the following constraints and rules:

              [1]    You cannot use type.

              [2]    The system generates an instance variable class for you,  which  points  from  instance  to
                     class structure. This makes you also subject to the rules below, for instance variables.

       [3]    If  you  declare  instance  variables (possibly automatic, see above) you are subject to following
              constraints and rules:

              [1]    You cannot use type.

              [2]    The system generates and manages  an  instance  variable  cmd  for  you,  which  holds  the
                     Tcl_Command token of the instance command.

              [3]    The system generates an instance method destroy for you.

              [4]    The  system  manages  allocation and release of the instance structure for you. You have to
                     care only about the instance variables themselves.

EXAMPLE

       The example shown below  is  the  specification  of  queue  data  structure,  with  most  of  the  method
       implementations and support code omitted to keep the size down.

       The   full  implementation  can  be  found  in  the  directory  "examples/queue"  of  the  critcl  source
       distribution/repository.

              package require Tcl 8.4
              package require critcl 3.1

              critcl::buildrequirement {
                  package require critcl::class ; # DSL, easy spec of Tcl class/object commands.
              }

              critcl::cheaders util.h

              critcl::class::define ::queuec {
                  include util.h

                  insvariable Tcl_Obj* unget {
                List object unget elements
                  } {
                instance->unget = Tcl_NewListObj (0,NULL);
                Tcl_IncrRefCount (instance->unget);
                  } {
                Tcl_DecrRefCount (instance->unget);
                  }

                  insvariable Tcl_Obj* queue {
                List object holding the main queue
                  } {
                instance->queue = Tcl_NewListObj (0,NULL);
                Tcl_IncrRefCount (instance->queue);
                  } {
                Tcl_DecrRefCount (instance->queue);
                  }

                  insvariable Tcl_Obj* append {
                List object holding new elements
                  } {
                instance->append = Tcl_NewListObj (0,NULL);
                Tcl_IncrRefCount (instance->append);
                  } {
                Tcl_DecrRefCount (instance->append);
                  }

                  insvariable int at {
                Index of next element to return from the main queue
                  } {
                instance->at = 0;
                  }

                  support {... queue_peekget, queue_size, etc.}

                  method clear {} {...}
                  method destroy {...}

                  method get  as queue_peekget 1
                  method peek as queue_peekget 0

                  method put {item ...}

                  method size {} {
                if ((objc != 2)) {
                    Tcl_WrongNumArgs (interp, 2, objv, NULL);
                    return TCL_ERROR;
                }

                Tcl_SetObjResult (interp, Tcl_NewIntObj (queue_size (instance, NULL, NULL, NULL)));
                return TCL_OK;
                  }

                  method unget {item} {...}
              }

              package provide queuec 1

AUTHORS

       Andreas Kupries

BUGS, IDEAS, FEEDBACK

       This document, and the package it describes, will undoubtedly contain bugs and  other  problems.   Please
       report  such at https://github.com/andreas-kupries/critcl.  Please also report any ideas for enhancements
       you may have for either package and/or documentation.

KEYWORDS

       C class, C code, C instance, C object, Embedded C Code, code generator, compile & run, compiler,  dynamic
       code  generation,  dynamic  compilation,  generate  package,  linker,  on  demand compilation, on-the-fly
       compilation

CATEGORY

       Glueing/Embedded C code

COPYRIGHT

       Copyright (c) 2011-2018 Andreas Kupries

doc                                                   1.1.1                                  critcl::class(3tcl)