xo-umbrella2/xo-facet/docs/index.rst

55 lines
1.9 KiB
ReStructuredText

# xo-facet documentation master file
xo-facet documentation
======================
xo-facet provides an object model that supports runtime polymorphism with interfaces and data kept separate.
Design operates on similar lines to rust traits, haskell type clases, and go interfaces.
Principles
----------
* Keep interfaces and data structures separate.
An object is represented using a combination of exactly two pointers:
an interface pointer and a data pointer.
* An interface pointer implements an abstract facet.
A facet has only abstract methods, and no state.
* An interface pointer is analogous to a vtable pointer in a regular
c++ object. It identifies a suite of related functions that operate
on a particular data type.
* A data pointer is like a pointer to a c struct.
Data objects are passive, except for necessary ctors/dtors.
Runtime polymorphism works seamlessly across different data types
without requiring any prearrangement such as sharing a common
base class.
* We make 'familiar c++ objects', on demand, by pairing an interface pointer
with a data pointer. Unlike usual c++ practice, we expect such objects
to be transient. To represent persistent state, we rely
solely on data pointers.
* Since interface+data are separate,
we can easily swap out one interface for another.
This gives us several benefits:
* A data type can easily particpate in polymorphism across different facets,
without complicating object representation. To convert an object to use a
different facet, we just swap out the interface pointer.
* Interface and data pointers can arrive at the doorstep of a computation
by different pathways. Often the pathway for an interface pointer is
simpler that the pathway for a data pointer. This increases scope for
devirtualization.
.. toctree::
:maxdepth: 2
:caption: xo-facet contents
implementation
glossary
genindex
search