From 6d4133cefe585f50d695dd0784c3afeacf38ac6d Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Tue, 27 Nov 2007 06:40:51 +0100 Subject: [PATCH] WIP generalizing my builder tools to use the acyclic visitor. inspired by Loki; ichthyo intends to use this pattern for typesafe visiting within the EDL too... --- doc/devel/uml/class128517.html | 2 +- doc/devel/uml/class128773.html | 2 +- doc/devel/uml/class128901.html | 2 +- doc/devel/uml/class129029.html | 2 +- doc/devel/uml/class129157.html | 2 +- doc/devel/uml/class129669.html | 2 +- doc/devel/uml/class129925.html | 2 +- doc/devel/uml/class130693.html | 2 +- doc/devel/uml/class134021.html | 6 +- doc/devel/uml/class134149.html | 12 +- doc/devel/uml/class134277.html | 4 +- doc/devel/uml/class134405.html | 4 +- doc/devel/uml/class138629.html | 2 +- doc/devel/uml/class138885.html | 2 +- doc/devel/uml/class140037.html | 24 ++++ doc/devel/uml/class140165.html | 27 ++++ doc/devel/uml/class140293.html | 25 ++++ doc/devel/uml/classes.html | 5 +- doc/devel/uml/classes_list.html | 5 +- doc/devel/uml/fig129285.png | Bin 38931 -> 53553 bytes doc/devel/uml/index.html | 22 +++- doc/devel/uml/index_126.html | 24 ++++ doc/devel/uml/index_60.html | 4 +- doc/devel/uml/index_65.html | 6 +- doc/devel/uml/index_66.html | 2 + doc/devel/uml/index_67.html | 32 ++--- doc/devel/uml/index_68.html | 3 +- doc/devel/uml/index_79.html | 2 +- doc/devel/uml/index_82.html | 2 +- doc/devel/uml/index_83.html | 4 +- doc/devel/uml/index_84.html | 12 +- doc/devel/uml/index_86.html | 21 +-- doc/devel/uml/navig.html | 2 +- doc/devel/uml/packages.html | 3 +- doc/devel/uml/public_operations.html | 12 +- src/common/visitor.cpp | 35 +++++ src/common/visitor.hpp | 121 ++++++++++++++++++ src/proc/mobject/buildable.cpp | 8 +- src/proc/mobject/buildable.hpp | 16 ++- .../builder/{tool.cpp => buildertool.cpp} | 4 +- .../builder/{tool.hpp => buildertool.hpp} | 7 +- src/proc/mobject/builder/nodecreatertool.hpp | 7 +- src/proc/mobject/builder/segmentationtool.hpp | 7 +- src/proc/mobject/builder/toolfactory.cpp | 2 +- src/proc/mobject/builder/toolfactory.hpp | 4 +- tests/50components.tests | 4 + tests/54builder.tests | 7 + tests/components/common/visitingtooltest.cpp | 93 ++++++++++++++ .../proc/mobject/builder/buildertooltest.cpp | 73 +++++++++++ uml/cinelerra3/128517 | 85 +++++++++++- uml/cinelerra3/128901 | 81 ++++++++---- uml/cinelerra3/129285 | 2 +- uml/cinelerra3/129285.diagram | 106 ++++++++++----- uml/cinelerra3/129413 | 45 ++++++- uml/cinelerra3/130565 | 6 +- uml/cinelerra3/130949 | 33 +++++ uml/cinelerra3/5.session | 17 ++- uml/cinelerra3/cinelerra3.prj | 2 +- wiki/renderengine.html | 4 +- 59 files changed, 888 insertions(+), 164 deletions(-) create mode 100644 doc/devel/uml/class140037.html create mode 100644 doc/devel/uml/class140165.html create mode 100644 doc/devel/uml/class140293.html create mode 100644 doc/devel/uml/index_126.html create mode 100644 src/common/visitor.cpp create mode 100644 src/common/visitor.hpp rename src/proc/mobject/builder/{tool.cpp => buildertool.cpp} (89%) rename src/proc/mobject/builder/{tool.hpp => buildertool.hpp} (88%) create mode 100644 tests/components/common/visitingtooltest.cpp create mode 100644 tests/components/proc/mobject/builder/buildertooltest.cpp create mode 100644 uml/cinelerra3/130949 diff --git a/doc/devel/uml/class128517.html b/doc/devel/uml/class128517.html index f82e4009d..9b18007fc 100644 --- a/doc/devel/uml/class128517.html +++ b/doc/devel/uml/class128517.html @@ -21,6 +21,6 @@
Attribut length

Declaration :

TODO: how to represent time intervals?

-

All public operations : apply

+

All public operations : apply , apply , dispatchOp

diff --git a/doc/devel/uml/class128773.html b/doc/devel/uml/class128773.html index 81c885f5b..4d2eb1713 100644 --- a/doc/devel/uml/class128773.html +++ b/doc/devel/uml/class128773.html @@ -19,6 +19,6 @@

Declaration :

Directly inherited by : Clip Effect Meta

Artifact : abstractmo

-

All public operations : apply

+

All public operations : apply , apply , dispatchOp

diff --git a/doc/devel/uml/class128901.html b/doc/devel/uml/class128901.html index a4c14a225..3258b0d8f 100644 --- a/doc/devel/uml/class128901.html +++ b/doc/devel/uml/class128901.html @@ -22,6 +22,6 @@
Attribut start

Declaration :

startpos in source

Relation source (<unidirectional association>)

Declaration :

the media source this clip referes to

-

All public operations : apply

+

All public operations : apply , apply , dispatchOp

diff --git a/doc/devel/uml/class129029.html b/doc/devel/uml/class129029.html index e6ec7aa31..f9a14681d 100644 --- a/doc/devel/uml/class129029.html +++ b/doc/devel/uml/class129029.html @@ -20,6 +20,6 @@
Attribut plugID

Declaration :

Identifier of the Plugin to be used

-

All public operations : apply

+

All public operations : apply , apply , dispatchOp

diff --git a/doc/devel/uml/class129157.html b/doc/devel/uml/class129157.html index b29f58556..fb8effd05 100644 --- a/doc/devel/uml/class129157.html +++ b/doc/devel/uml/class129157.html @@ -19,6 +19,6 @@

Declaration :

Directly inherited by : Auto Label

Artifact : meta

-

All public operations : apply

+

All public operations : apply , apply , dispatchOp

diff --git a/doc/devel/uml/class129669.html b/doc/devel/uml/class129669.html index 832aed5e2..8653baa45 100644 --- a/doc/devel/uml/class129669.html +++ b/doc/devel/uml/class129669.html @@ -18,6 +18,6 @@

Declaration :

Artifact : label

-

All public operations : apply

+

All public operations : apply , apply , dispatchOp

diff --git a/doc/devel/uml/class129925.html b/doc/devel/uml/class129925.html index ee1a92f29..3052beb5b 100644 --- a/doc/devel/uml/class129925.html +++ b/doc/devel/uml/class129925.html @@ -19,6 +19,6 @@

Declaration :

Automation data for some parameter (i.e. a time varying function)

Artifact : auto

Operation getValue

Declaration :

-

All public operations : apply , getValue , getValue

+

All public operations : apply , apply , dispatchOp , getValue , getValue

diff --git a/doc/devel/uml/class130693.html b/doc/devel/uml/class130693.html index aaf7fd304..a40a37ad4 100644 --- a/doc/devel/uml/class130693.html +++ b/doc/devel/uml/class130693.html @@ -18,7 +18,7 @@

Declaration :

Artifact : toolfactory

-
Operation configure

Declaration :

+
Operation configure

Declaration :

All public operations : configure

diff --git a/doc/devel/uml/class134021.html b/doc/devel/uml/class134021.html index 0f4c8e720..01a81da6f 100644 --- a/doc/devel/uml/class134021.html +++ b/doc/devel/uml/class134021.html @@ -16,10 +16,10 @@ -

Declaration :

Directly inherited by : MObject

+

Declaration :

Directly inherited by : MObject

Artifact : buildable

-
Operation apply

Declaration :

-

All public operations : apply

+
Operation apply

Declaration :

+

All public operations : apply , apply , dispatchOp

diff --git a/doc/devel/uml/class134149.html b/doc/devel/uml/class134149.html index d405b1b3f..ec9c026f4 100644 --- a/doc/devel/uml/class134149.html +++ b/doc/devel/uml/class134149.html @@ -4,22 +4,22 @@ -Class Tool +Class BuilderTool -
Class Tool
+
Class BuilderTool

-

Declaration :

Directly inherited by : NodeCreatorTool SegmentationTool

-

Used according to the visitor pattern: each Tool contains the concrete implementation for one task to be done to the various MObject classes

Artifact : tool

+

Declaration :

Directly inherited by : NodeCreatorTool SegmentationTool

+

Used according to the visitor pattern: each Tool contains the concrete implementation for one task to be done to the various MObject classes

Artifact : buildertool

-
Operation treat

Declaration :

  • Uml : + treat(in mElement : Buildable) : void
  • C++ : public: void treat (const Buildable& mElement)

This operation is to be overloaded for the specific MObject subclasses to be treated.

-

All public operations : treat

+
Operation treat

Declaration :

This operation is to be overloaded for the specific MObject subclasses to be treated.

+

All public operations : treat , treat

diff --git a/doc/devel/uml/class134277.html b/doc/devel/uml/class134277.html index ca5d2bff7..6c87e8635 100644 --- a/doc/devel/uml/class134277.html +++ b/doc/devel/uml/class134277.html @@ -16,12 +16,12 @@ -

Declaration :

Tool implementation for deriving a partitioning of the current timeline such, that each segement has a constant configuration. "Constant" means here, that any remaining changes over time can be represented by automation solely, without the need to change the node connections.

Artifact : segmentationtool

+

Declaration :

Tool implementation for deriving a partitioning of the current timeline such, that each segement has a constant configuration. "Constant" means here, that any remaining changes over time can be represented by automation solely, without the need to change the node connections.

Artifact : segmentationtool

Operation treat

Declaration :

  • Uml : + treat(in something : Buildable) : void
  • C++ : public: void treat (const Buildable& something)
Operation treat

Declaration :

  • Uml : + treat(in clip : Clip) : void
  • C++ : public: void treat (const Clip& clip)
Operation treat

Declaration :

  • Uml : + treat(in effect : Effect) : void
  • C++ : public: void treat (const Effect& effect)
Relation segments (<directional aggregation by value>)

Declaration :

  • Uml : # segments : Segment, multiplicity : *
  • C++ : protected: list<Segment> segments

the partitioning of the Timeline to be created by this tool.

-

All public operations : treat , treat , treat , treat

+

All public operations : treat , treat , treat , treat , treat

diff --git a/doc/devel/uml/class134405.html b/doc/devel/uml/class134405.html index 3233a3151..8030835d6 100644 --- a/doc/devel/uml/class134405.html +++ b/doc/devel/uml/class134405.html @@ -16,7 +16,7 @@ -

Declaration :

This Tool implementation plays the central role in the buld process: given a MObject from Session, it is able to attach ProcNodes to the render engine under construction such as to reflect the properties of the MObject in the actual render.

Artifact : nodecreatertool

+

Declaration :

This Tool implementation plays the central role in the buld process: given a MObject from Session, it is able to attach ProcNodes to the render engine under construction such as to reflect the properties of the MObject in the actual render.

Artifact : nodecreatertool

Operation treat

Declaration :

  • Uml : + treat(inout something : Buildable) : void
  • C++ : public: void treat (Buildable& something)
Operation treat

Declaration :

  • Uml : + treat(inout clip : Clip) : void
  • C++ : public: void treat (Clip& clip)
@@ -24,6 +24,6 @@
Operation treat

Declaration :

  • Uml : + treat(inout auto : Auto) : void
  • C++ : public: void treat (Auto& auto)
Attribut proc

Declaration :

holds the Processor (Render Engine Element) to be built by the current build step

-

All public operations : treat , treat , treat , treat , treat

+

All public operations : treat , treat , treat , treat , treat , treat

diff --git a/doc/devel/uml/class138629.html b/doc/devel/uml/class138629.html index 9bc8209f7..83cab8165 100644 --- a/doc/devel/uml/class138629.html +++ b/doc/devel/uml/class138629.html @@ -19,6 +19,6 @@

Declaration :

  • C++ : class CompoundClip : public Clip

Clip MObject which is actually a compound of several elementary clips,
e.g. the several streams found within multichannels media.

Artifact : compoundclip, Diagram : Session structure

Relation components (<directional aggregation>)

Declaration :

  • Uml : # components : Clip, multiplicity : 1..*
  • C++ : protected: Clip* components
-

All public operations : apply

+

All public operations : apply , apply , dispatchOp

diff --git a/doc/devel/uml/class138885.html b/doc/devel/uml/class138885.html index 987c50371..ce532c0e7 100644 --- a/doc/devel/uml/class138885.html +++ b/doc/devel/uml/class138885.html @@ -18,6 +18,6 @@

Declaration :

  • C++ : class SimpleClip : public Clip

Elementary clip consisting of only one media stream

Artifact : simpleclip

-

All public operations : apply

+

All public operations : apply , apply , dispatchOp

diff --git a/doc/devel/uml/class140037.html b/doc/devel/uml/class140037.html new file mode 100644 index 000000000..78d699a6c --- /dev/null +++ b/doc/devel/uml/class140037.html @@ -0,0 +1,24 @@ + + + + + + +Class Tool + + + + + +
Class Tool
+

+ + + + +

Declaration :

  • C++ : class Tool

Directly inherited by : BuilderTool

+

Artifact : visitor

+ +
Operation ~Tool

Declaration :

  • Uml : + ~Tool() :
  • C++ : public: virtual ~Tool ()
+ + diff --git a/doc/devel/uml/class140165.html b/doc/devel/uml/class140165.html new file mode 100644 index 000000000..d6e4f6a5e --- /dev/null +++ b/doc/devel/uml/class140165.html @@ -0,0 +1,27 @@ + + + + + + +Class Visitable + + + + + +
Class Visitable
+

+ + + + +

Declaration :

  • C++ : class Visitable

Directly inherited by : Buildable

+

Artifact : visitor

+ +
Operation ~Visitable

Declaration :

  • Uml : # ~Visitable() :
  • C++ : protected: virtual ~Visitable ()
+
Operation apply

Declaration :

  • Uml : abstract, + apply(inout providedTool : Tool) : void
  • C++ : public: virtual void apply (Tool& providedTool) = 0
+
Operation dispatchOp

Declaration :

  • Uml : static, + dispatchOp(inout target : TAR, inout t : Tool) : void
  • C++ : public: static void dispatchOp (TAR& target, Tool& t)
+

All public operations : apply , dispatchOp

+ + diff --git a/doc/devel/uml/class140293.html b/doc/devel/uml/class140293.html new file mode 100644 index 000000000..2c824ca50 --- /dev/null +++ b/doc/devel/uml/class140293.html @@ -0,0 +1,25 @@ + + + + + + +Class Applicable + + + + + +
Class Applicable
+

+ + + + +

Declaration :

  • C++ : template<class TAR> class Applicable

Directly inherited by : BuilderTool NodeCreatorTool SegmentationTool

+

Artifact : visitor

+ +
Operation treat

Declaration :

  • Uml : abstract, + treat(inout visitable : TAR) :
  • C++ : public: virtual treat (TAR& visitable) = 0
+

All public operations : treat

+ + diff --git a/doc/devel/uml/classes.html b/doc/devel/uml/classes.html index a93cd61e0..a411e8c2e 100644 --- a/doc/devel/uml/classes.html +++ b/doc/devel/uml/classes.html @@ -20,6 +20,7 @@ AFrame Allocationa directive to place a MObject in a specific way AppconfigsingletonSingleton to hold inevitable global flags and constants and for performing erarly (static) global initialization tasks. +Applicable ARenderRepresentation of a Audio render process AssemblerThis is the actual building facility: provided the correct tools and associations, it serves to build and connect the individual ProcNode objects AssetinterfaceSuperinterface describing especially the bookeeping properties of Assets @@ -27,6 +28,7 @@ AutoAutomation data for some parameter (i.e. a time varying function) Buildableinterface BuilderFacadeboundaryProvides unified access to the builder functionality. While individual components of the builder subsystem may be called if necessary or suitable, it is usually better to do all extern invocations via the high level methods of this Facade +BuilderToolinterfaceUsed according to the visitor pattern: each Tool contains the concrete implementation for one task to be done to the various MObject classes BuildInstruct(Interface) building instructions to be executed by the Builder on the render node network under construction. Categorytree like classification of Assets Clipbookkeeping (asset) view of a media clip. @@ -118,13 +120,14 @@ Structkey abstraction: structural asset ThreadWe can basically reuse the Thread class design from cinelerra2, Thread becomes a baseclass for all Threads Timedenotes a temporal position (time point), based on timeline start.

investigate posix.4 realtime timers, wrap these here -ToolinterfaceUsed according to the visitor pattern: each Tool contains the concrete implementation for one task to be done to the various MObject classes +Tool ToolFactory Trackstructural asset holding the configuration of a track in the EDL Track Trafo Unknownplaceholder for unknown or unavailable media source VFrame +Visitable VRenderRepresentation of a Video render process. (Encapsulates the video buffers for the actual calculations) Wish WriteBuffer diff --git a/doc/devel/uml/classes_list.html b/doc/devel/uml/classes_list.html index d5c17b7d5..b91453124 100644 --- a/doc/devel/uml/classes_list.html +++ b/doc/devel/uml/classes_list.html @@ -21,6 +21,7 @@ AFrame
Allocation
Appconfig
+Applicable
ARender
Assembler
Asset
@@ -28,6 +29,7 @@ Auto
Buildable
BuilderFacade
+BuilderTool
BuildInstruct
Category
Clip
@@ -119,13 +121,14 @@ Struct
Thread
Time
-Tool
+Tool
ToolFactory
Track
Track
Trafo
Unknown
VFrame
+Visitable
VRender
Wish
WriteBuffer
diff --git a/doc/devel/uml/fig129285.png b/doc/devel/uml/fig129285.png index 248d56153b64bf86e9b8dc0196a1ea7bb2f2a70f..20e099fca899a401732181c845b869aa94cc1bae 100644 GIT binary patch literal 53553 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

&Td25>ag*||3y4ZQz63_ zkN$&e5KPo+{lwLw3Fb1r_?3lQSaDFM>Y>N-K*V;U3bdrlmTKYd3=@k_{U26Sym$3~ zGt5eY{-7HX<9IlGfPusGX*JC!jnk?-br|NU!^4Ar#XBrlO|@F2LgYT%%BsCs;7=cCap__T=m~uM0UrQ}c$st1BL^ zccGf6G1=t5qLbPwgdhq3Vl;+G>V{jS2^TABtEf}l*8_qZ#tt=pfj2Q$zBEU-Pg2gvhExKtUj47XL^5 x{J+B%e50R3E9l`PM1dUzfBbjY{qx^WeXX1oC}Of)B;i{S(hud41>y$J|39*RH5>o{ literal 38931 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
Artifact Cinelerra3

Depends on common

Depends on gui

Depends on proc

Depends on backend

the main executable to be built

-

executable associated with : placement, sessionimpl, builderfacade, controllerfacade, processor, pluginadapter, effect, tool, segmentationtool, aframe, assembler, trafo, explicitplacement, auto, glrender, link, parameter, renderengine, allocation, vframe, toolfactory, arender, renderstate, label, glbuf, procnode, stateproxy, hub, buildable, abstractmo, nodecreatertool, projector, interpolator, edl, fixture, glpipe, exitnode, pathmanager, track, paramprovider, mask, main, conmanager, clip, meta, fixedlocation, relativelocation, vrender, mobject, source, frame

+

executable associated with : controllerfacade, processor, pluginadapter, effect, buildertool, segmentationtool, aframe, assembler, trafo, explicitplacement, auto, glrender, link, parameter, renderengine, allocation, vframe, toolfactory, arender, renderstate, label, glbuf, procnode, stateproxy, hub, buildable, abstractmo, nodecreatertool, projector, interpolator, edl, fixture, glpipe, exitnode, pathmanager, track, paramprovider, mask, main, conmanager, clip, meta, fixedlocation, relativelocation, vrender, mobject, source, frame, placement, sessionimpl, builderfacade

Artifact main

Artifact source

@@ -128,6 +128,10 @@ Documentation

1.3.2.1 Deployment View gen

defines source files to be generated by BOUML

+ +
Artifact visitor
+

Acyclic Visitor library

+

Artifact source associated with : Visitable, Tool, Applicable

Artifact error

Cinelerra Exception Interface

@@ -146,7 +150,12 @@ Documentation

  • C++ namespace : cinelerra::error
-

Namespace for Exception Kinds

+

Namespace for Exception Kinds

+

1.3.2.3 Package visitor

+

    +
  • C++ namespace : cinelerra::visitor
  • +
+

sub-namespace for visitor library implementation

1.3.3 Package backend

    @@ -425,9 +434,9 @@ Documentation

    building facility (implementation of the build process)

    Artifact source associated with : Assembler

    -
    Artifact tool
    +
    Artifact buildertool

    Interface, any tool for processing MObjects

    -

    Artifact source associated with : Tool

    +

    Artifact source associated with : BuilderTool

    Artifact segmentationtool

    Tool for creating a partitioning of the current timeline

    @@ -739,7 +748,7 @@ Documentation
    Class Assembler
    Class Buildable
    -
    Class Tool
    +
@@ -1132,6 +1141,9 @@ reuse exiting Engine

Selection :

    Transformation

    5.2 Class View Service Components

    +
    +
    Class Tool
    +
    Class Visitable
    Class Time
    Class Factory
    Class Appconfig
    diff --git a/doc/devel/uml/index_126.html b/doc/devel/uml/index_126.html new file mode 100644 index 000000000..24ae2f606 --- /dev/null +++ b/doc/devel/uml/index_126.html @@ -0,0 +1,24 @@ + + + + + + +~ + + + + + +
    ~
    +

    + + + + + + + +
    NameKindDescription
    ~Tooloperation
    ~Visitableoperation
    + + diff --git a/doc/devel/uml/index_60.html b/doc/devel/uml/index_60.html index 0a78be5d0..75ccc147d 100644 --- a/doc/devel/uml/index_60.html +++ b/doc/devel/uml/index_60.html @@ -17,8 +17,8 @@ - + @@ -30,8 +30,8 @@ - + diff --git a/doc/devel/uml/index_65.html b/doc/devel/uml/index_65.html index 5984e789e..d570a1c71 100644 --- a/doc/devel/uml/index_65.html +++ b/doc/devel/uml/index_65.html @@ -31,7 +31,9 @@ + + @@ -49,12 +51,12 @@ - + + - diff --git a/doc/devel/uml/index_66.html b/doc/devel/uml/index_66.html index 5ed3d76c4..9158c65e4 100644 --- a/doc/devel/uml/index_66.html +++ b/doc/devel/uml/index_66.html @@ -40,6 +40,8 @@ + + diff --git a/doc/devel/uml/index_67.html b/doc/devel/uml/index_67.html index f3abdcc6c..269befa2c 100644 --- a/doc/devel/uml/index_67.html +++ b/doc/devel/uml/index_67.html @@ -29,34 +29,34 @@ - - - - - + - - - - - - - + + + + - - + + + - + - + + + + + + + diff --git a/doc/devel/uml/index_68.html b/doc/devel/uml/index_68.html index cdeda3e68..68da1dfbd 100644 --- a/doc/devel/uml/index_68.html +++ b/doc/devel/uml/index_68.html @@ -28,10 +28,11 @@ - + +
    NameKindDescription
    <flow>transition
    <flow>transition
    <flow>transition
    <flow>transition
    <flow>transition
    <flow>transition
    <flow>transition
    <flow>transition
    <flow>transition
    <flow>transition
    <flow>transition
    <flow>transition
    <flow>transition
    <flow>transition
    <flow>transition
    Appconfigoperationperform initialization on first access.
    A call is placed in static initialization code
    included in cinelerra.h; thus it will happen
    ubiquitous very early.
    appconfigartifactfor global initialization and configuration
    AppconfigclassSingleton to hold inevitable global flags and constants and for performing erarly (static) global initialization tasks.
    Applicableclass
    applyoperation
    applyoperation
    Architecturecomponent viewThe various Components comprising the Cinelerra3 Video editing Application
    ARenderclassRepresentation of a Audio render process
    arenderartifactRepresentation of a Audio Render process
    Assetsclass view
    ATTACHattributeattach subject to anchor (e.g. an effect to a clip)
    au1class instance
    aud_aclass instance
    aud_Aclass instance
    aud_aclass instance
    audioclass instance
    audio1class instance
    audio1class instance
    audio1class instance
    audio1class instance
    autoartifactMedia Object holding automation data
    AutoclassAutomation data for some parameter (i.e. a time varying function)
    Automation Entitiesclass diagram
    Builder Workingsclass view
    BuilderFacadeclassProvides unified access to the builder functionality. While individual components of the builder subsystem may be called if necessary or suitable, it is usually better to do all extern invocations via the high level methods of this Facade
    builderfacadeartifactFacade and service access point for the Builder Subsystem
    BuilderToolclassUsed according to the visitor pattern: each Tool contains the concrete implementation for one task to be done to the various MObject classes
    buildertoolartifactInterface, any tool for processing MObjects
    building the Engineactivity
    BuildInstructclass(Interface) building instructions to be executed by the Builder on the render node network under construction.
    buildinstructartifactInstructions for building some configuration of render nodes.
    checked_outrelationthis list keeps all mappings which are in use, and thus prevents them from Cache aging
    Cinelerra3artifactthe main executable to be built
    cinelerra3package
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    class instanceclass instance
    clearoperationclear current session contents
    without resetting overall session config.
    Afterwards, the session will contain only one
    empty EDL, while all Assets are retained.
    Clipclassbookkeeping (asset) view of a media clip.
    clipartifactbookkeeping (asset) view of a media clip.
    designpackage
    designpackageAll things concering the big picture.
    Not a real code package, rather a container for design drafts, specifications, decisions.
    detect Channelsuse case
    determine Render Paramsexpansion region
    determine Render Paramsopaque activity action
    determine Render Paramsexpansion region
    devnullclass instance
    Dispatchercomponent
    dispatchOpoperation
    DoAttachclass
    DoRecurseclass
    diff --git a/doc/devel/uml/index_79.html b/doc/devel/uml/index_79.html index 4902abfdc..9ba074764 100644 --- a/doc/devel/uml/index_79.html +++ b/doc/devel/uml/index_79.html @@ -19,9 +19,9 @@ NameKindDescription offsetattributeOffset the actual position by this (time) value relative to the anchor point. TODO: Representation? orgattributeorigin or authorship id. Can be a project abbreviation, a package id or just the authors nickname or UID. This allows for the compnent name to be more generic (e.g. "blur"). Default for all assets provided by the core cinelerra-3 codebase is "cin3". +ouputclass instance ouputclass instance ouputclass instance -ouputclass instance OutPortclassstructural asset corresponding to some port generating media output outportartifactstructural asset corresponding to some port generating media output outputrelation diff --git a/doc/devel/uml/index_82.html b/doc/devel/uml/index_82.html index 3a3a83808..a76e8f590 100644 --- a/doc/devel/uml/index_82.html +++ b/doc/devel/uml/index_82.html @@ -22,8 +22,8 @@ registryrelation@internal Table or DB holding all registered asset instances. relativelocationartifactPlacement implemnetaion providing various ways of attaching a MObject to another one RelativeLocationclass -RelTypeclassthe possible kinds of RelativePlacements relTypeattributethe kind of relation denoted by this Placement +RelTypeclassthe possible kinds of RelativePlacements removeoperationremove the given asset <i>together with all its dependants</i> from the internal DB Render Entitiesclass diagram Render Requestactivity parameter diff --git a/doc/devel/uml/index_83.html b/doc/devel/uml/index_83.html index 5c1a18530..eb3719cf0 100644 --- a/doc/devel/uml/index_83.html +++ b/doc/devel/uml/index_83.html @@ -31,8 +31,8 @@ Service Componentsclass view Sessioncomponent sessionartifactInterface: the session edited by the user -sessionpackagesourcecode package

    Everything concerning the EDL and Session, within the MObject Subsystem Sessionclass view +sessionpackagesourcecode package

    Everything concerning the EDL and Session, within the MObject Subsystem SessionclassPrimary Interface for all editing tasks.
    The session contains defaults, all the assets being edited, and a set of EDL with the individual MObjects to be manipulated and rendered. Session structureclass diagram sessionimplartifactholds the complete session data to be edited by the user @@ -46,8 +46,8 @@ SimpleClipclassElementary clip consisting of only one media stream SmartPointerclass SmartPointersclass view -sourcerelationthe media source this clip referes to sourcerelationmedia source of this clip +sourcerelationthe media source this clip referes to SourceclassSource Node: represents a media source to pull data from. sourceartifactRepresentation of a Media source Source Overviewdeployment diagram diff --git a/doc/devel/uml/index_84.html b/doc/devel/uml/index_84.html index 686d34aef..00c40c769 100644 --- a/doc/devel/uml/index_84.html +++ b/doc/devel/uml/index_84.html @@ -25,9 +25,8 @@ Timeclassdenotes a temporal position (time point), based on timeline start.

    investigate posix.4 realtime timers, wrap these here timelinenode timelinerelation -ToolclassUsed according to the visitor pattern: each Tool contains the concrete implementation for one task to be done to the various MObject classes toolpackagesourcecode package

    Tools and Utilities
    (separate from the main cinelrra binary) -toolartifactInterface, any tool for processing MObjects +Toolclass ToolFactoryclass toolfactoryartifactsupply of Tool implementations for the Builder Trackclassstructural asset holding the configuration of a track in the EDL @@ -40,14 +39,15 @@ tracksrelation Trafoclass trafoartifacttransforming processing Node -treatoperation -treatoperation +treatoperation +treatoperationThis operation is to be overloaded for the specific MObject subclasses to be treated. treatoperation treatoperation -treatoperation +treatoperation +treatoperation treatoperation treatoperation -treatoperationThis operation is to be overloaded for the specific MObject subclasses to be treated. +treatoperation diff --git a/doc/devel/uml/index_86.html b/doc/devel/uml/index_86.html index ce992fef4..8695a80a4 100644 --- a/doc/devel/uml/index_86.html +++ b/doc/devel/uml/index_86.html @@ -20,23 +20,26 @@ versionattributeversion number of the thing or concept represented by this asset. Of each unique tuple (name, category, org) there will be only one version in the whole system. Version 0 is reserved for internal purposes. Versions are considered to be ordered, and any higher version is supposed to be fully backwards compatible to all previous versions. VFrameclass vframeartifacta buffer and render process holding a Video frame -vid1class instance vid1class instance -vid_Aclass instance -vid_Aclass instance +vid1class instance vid_aclass instance -vid_Aclass instance +vid_Aclass instance vid_aclass instance +vid_Aclass instance +vid_Aclass instance videoclass instance -videoclass instance videoclass instance +videoclass instance videoclass instance -video1class instance -video1class instance -video1class instance -video1class instance video1class instance video1class instance +video1class instance +video1class instance +video1class instance +video1class instance +Visitableclass +visitorpackagesub-namespace for visitor library implementation +visitorartifactAcyclic Visitor library VRenderclassRepresentation of a Video render process. (Encapsulates the video buffers for the actual calculations) vrenderartifactRepresentation of a Video render process diff --git a/doc/devel/uml/navig.html b/doc/devel/uml/navig.html index 1d6f86b34..facf4a06c 100644 --- a/doc/devel/uml/navig.html +++ b/doc/devel/uml/navig.html @@ -12,6 +12,6 @@

    -Top- -Classes- -Public Operations- -Public properties- -Packages- -Use Cases- -Activities- -Class Diagrams- -Object Diagrams- -Activity Diagrams- -Use Case Diagrams- -Collaboration Diagrams- -Component Diagrams- -Deployment Diagrams-

    -

    < A B C D E F G H I K L M N O P R S T U V W

    +

    < A B C D E F G H I K L M N O P R S T U V W ~

    diff --git a/doc/devel/uml/packages.html b/doc/devel/uml/packages.html index 0a87e3bd1..aac0bc389 100644 --- a/doc/devel/uml/packages.html +++ b/doc/devel/uml/packages.html @@ -20,8 +20,8 @@ Asset backendsrcsourcecode package

    Data backend classes here... BackendLayer -Builder buildersrcsourcecode package

    The Builder creating the Render Engine,
    located within the MObject Subsystem +Builder cinelerra3 codegenThis package is used to organize code generation by BOUML. It is considered useless after having generated the initial code skeleton. commonsrcsourcecode package

    Common library and helper classes @@ -41,6 +41,7 @@ RenderEngine sessionsrcsourcecode package

    Everything concerning the EDL and Session, within the MObject Subsystem toolsrcsourcecode package

    Tools and Utilities
    (separate from the main cinelrra binary) +visitorsub-namespace for visitor library implementation diff --git a/doc/devel/uml/public_operations.html b/doc/devel/uml/public_operations.html index 745c339b7..d0aedd4c7 100644 --- a/doc/devel/uml/public_operations.html +++ b/doc/devel/uml/public_operations.html @@ -18,6 +18,7 @@ + @@ -26,6 +27,7 @@ + @@ -52,18 +54,20 @@ - - + + - + + + - +
    OperationClassDescription
    applyBuildable
    applyVisitable
    buildAssembler
    buildEngineBuilderFacadeMain Operation of the Builder: create a render engine for a given part of the timeline
    buildProcessorPathManager
    configureToolFactory
    createClipMediacreate a (possibly compound) Clip refering to this media, ready to be added to the EDL.
    currEDLSessionThe EDL currently in focus. In most cases, Session and EDL are almost the same, just EDL emphasizes the collection aspect. But generally (for larger editing projects) one Session can contain several EDLs, which may even be nested. At any given time, only one of these EDLs has focus and recieves the editing commands.
    dispatchOpVisitable
    enableAssetchange the enabled status of this asset. Note the corresponding #isActive predicate may depend on the enablement status of parent assets as well
    getAppconfigaccess the configuation value for a given key.
    @return empty string for unknown keys, else the corresponding configuration value
    get_reprAllocation
    resolvePlacementcreate an actual (explicit) placement while trying to satisfy the network of adjacent objects and placements.
    rootCauseErrorIf this exception was caused by a chain of further exceptions,
    return the first one registered in this throw sequence.
    This works only, if every exceptions thrown as a consequence
    of another exception is propperly constructed by passing
    the original exception to the constructor
    saveSessManagercreate a complete, serialized representation
    of the current session config and contents.
    @todo how to serialize, prameters, return value?
    treatNodeCreatorTool
    treatNodeCreatorTool
    treatApplicable
    treatBuilderToolThis operation is to be overloaded for the specific MObject subclasses to be treated.
    treatNodeCreatorTool
    treatNodeCreatorTool
    treatSegmentationTool
    treatNodeCreatorTool
    treatNodeCreatorTool
    treatSegmentationTool
    treatSegmentationTool
    treatSegmentationTool
    treatToolThis operation is to be overloaded for the specific MObject subclasses to be treated.
    useFileFileProviderAnnounces that the application intends to use this file with mode (READ|WRITE|READWRITE)
    useTemporaryStorageFileProviderProvides a pool for interminate frames
    whatError
    whatstd::exceptionthe base class of all exceptions thrown by the standard library
    ~ToolTool
    diff --git a/src/common/visitor.cpp b/src/common/visitor.cpp new file mode 100644 index 000000000..4903b6d5d --- /dev/null +++ b/src/common/visitor.cpp @@ -0,0 +1,35 @@ +/* + Vistitable,Tool,Applicable - Acyclic Visitor library + + Copyright (C) CinelerraCV + 2007, Hermann Vosseler + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +* *****************************************************/ + + +#include "common/visitor.hpp" + +namespace cinelerra + { + namespace visitor + { + + + + } // namespace visitor + +} // namespace cinelerra diff --git a/src/common/visitor.hpp b/src/common/visitor.hpp new file mode 100644 index 000000000..b3323bc8a --- /dev/null +++ b/src/common/visitor.hpp @@ -0,0 +1,121 @@ +/* + VISITOR.hpp - Acyclic Visitor library + + Copyright (C) CinelerraCV + 2007, Hermann Vosseler + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +==================================================================== +This code is heavily inspired by + The Loki Library (loki-lib/trunk/include/loki/Visitor.h) + Copyright (c) 2001 by Andrei Alexandrescu + This Loki code accompanies the book: + Alexandrescu, Andrei. "Modern C++ Design: Generic Programming + and Design Patterns Applied". + Copyright (c) 2001. Addison-Wesley. ISBN 0201704315 + +*/ + + + +#ifndef CINELERRA_VISITOR_H +#define CINELERRA_VISITOR_H + + + +namespace cinelerra + { + namespace visitor + { + + + /** Marker interface / base class for all "visiting tools". + * When applying such a tool to some concrete instance + * derived from Visitable, a special function treating + * this concrete subclass can be selected on the visiting + * tool instance. + */ + class Tool + { + public: + virtual ~Tool () { }; ///< use RTTI for all visiting tools + }; + + + + /** mixin template to declare that some "visiting tool" + * wants to treat a concrete subclass of Visitable + */ + template + < class TAR, + typename RET = void + > + class Applicable + { + public: + typedef RET ReturnType; + + /** to be implemented by concrete tools + * wanting to visit type TAR */ + virtual RET treat (TAR& visitable) = 0; + }; + + + + /** Marker interface / base class for all types + * to be treated by a "visiting tool" or visitor. + */ + template + class Visitable + { + public: + typedef RET ReturnType; + + protected: + virtual ~Visitable () { }; + + /** @internal used by the DEFINE_VISITABLE macro. + * Dispatches to the actual operation on the + * "visiting tool" (acyclic visitor implementation) + */ + template + static RET dispatchOp(TAR& target, Tool& tool) + { + if (Applicable* concreteTool + = dynamic_cast*> (&tool)) + + return concreteTool->treat (target); + + else + return ReturnType(); + } + }; + + +/** mark a Visitable subclass as actually treatable + * by some "visiting tool". Defines the apply-function, + * which is the actual access point to invoke the visiting + */ +#define DEFINE_VISITABLE() \ + virtual ReturnType apply (Tool& tool) \ + { return dispatchOp (*this, tool); } + + + + } // namespace visitor + +} // namespace cinelerra +#endif diff --git a/src/proc/mobject/buildable.cpp b/src/proc/mobject/buildable.cpp index 9f11ef017..e37e9f7d0 100644 --- a/src/proc/mobject/buildable.cpp +++ b/src/proc/mobject/buildable.cpp @@ -22,7 +22,7 @@ #include "proc/mobject/buildable.hpp" -#include "proc/mobject/builder/tool.hpp" +#include "proc/mobject/builder/buildertool.hpp" namespace mobject { @@ -32,10 +32,10 @@ namespace mobject * contain overloaded fuctions for treating * different Buildable subclasses specifically */ - void - Buildable::apply (builder::Tool& provided_tool) + Buildable::ReturnType + Buildable::apply (builder::BuilderTool& tool) { - provided_tool.treat( *this); //// TODO: how to call??? (ref or pointer??) + return dispatchOp (*this, tool); } diff --git a/src/proc/mobject/buildable.hpp b/src/proc/mobject/buildable.hpp index 17c6ad0ff..4e8d4df6c 100644 --- a/src/proc/mobject/buildable.hpp +++ b/src/proc/mobject/buildable.hpp @@ -25,24 +25,34 @@ #define MOBJECT_BUILDABLE_H +#include "common/visitor.hpp" + namespace mobject { - namespace builder{ class Tool; } + namespace builder{ class BuilderTool; } + using cinelerra::visitor::Visitable; + /** * All Buidables support double-dispatch of given Tool operations. * The actual operation is thus selected at runtime based both on the * actual type of the Tool class /and/ the actual type of the Buildabele. */ - class Buildable + class Buildable : public Visitable<> { public: - void apply (builder::Tool& provided_tool) ; + /** Catch-all implementation for applying any builder tool + * to some (uspecified) buildable object. Typically the provided + * actual Tool class will contain overloaded fuctions for treating + * different Buildable subclasses specifically and the concrete Buildables + * will define explicitly to be specifically visitable. + */ + virtual ReturnType apply (builder::BuilderTool&); }; diff --git a/src/proc/mobject/builder/tool.cpp b/src/proc/mobject/builder/buildertool.cpp similarity index 89% rename from src/proc/mobject/builder/tool.cpp rename to src/proc/mobject/builder/buildertool.cpp index 2afbfd2f4..a5d91c6b0 100644 --- a/src/proc/mobject/builder/tool.cpp +++ b/src/proc/mobject/builder/buildertool.cpp @@ -1,5 +1,5 @@ /* - Tool - Interface, any tool for processing MObjects + BuilderTool - Interface, (visiting) tool for processing MObjects Copyright (C) CinelerraCV 2007, Hermann Vosseler @@ -21,7 +21,7 @@ * *****************************************************/ -#include "proc/mobject/builder/tool.hpp" +#include "proc/mobject/builder/buildertool.hpp" namespace mobject diff --git a/src/proc/mobject/builder/tool.hpp b/src/proc/mobject/builder/buildertool.hpp similarity index 88% rename from src/proc/mobject/builder/tool.hpp rename to src/proc/mobject/builder/buildertool.hpp index 0d158c2fb..330a4a8da 100644 --- a/src/proc/mobject/builder/tool.hpp +++ b/src/proc/mobject/builder/buildertool.hpp @@ -1,5 +1,5 @@ /* - TOOL.hpp - Interface, any tool for processing MObjects + BUILDERTOOL.hpp - Interface, (visiting) tool for processing MObjects Copyright (C) CinelerraCV 2007, Hermann Vosseler @@ -24,6 +24,7 @@ #ifndef MOBJECT_BUILDER_TOOL_H #define MOBJECT_BUILDER_TOOL_H +#include "common/visitor.hpp" #include "proc/mobject/buildable.hpp" @@ -32,13 +33,15 @@ namespace mobject { namespace builder { + + using cinelerra::visitor::Tool; /** * Used according to the visitor pattern: each Tool contains * the concrete implementation for one task to be done to the various MObject classes */ - class Tool + class BuilderTool : public Tool { protected: typedef mobject::Buildable Buildable; diff --git a/src/proc/mobject/builder/nodecreatertool.hpp b/src/proc/mobject/builder/nodecreatertool.hpp index b4aa19297..59e5cc831 100644 --- a/src/proc/mobject/builder/nodecreatertool.hpp +++ b/src/proc/mobject/builder/nodecreatertool.hpp @@ -24,7 +24,7 @@ #ifndef MOBJECT_BUILDER_NODECREATERTOOL_H #define MOBJECT_BUILDER_NODECREATERTOOL_H -#include "proc/mobject/builder/tool.hpp" +#include "proc/mobject/builder/buildertool.hpp" #include "proc/mobject/buildable.hpp" #include "proc/engine/processor.hpp" @@ -53,8 +53,11 @@ namespace mobject * render engine under construction such as to reflect the properties * of the MObject in the actual render. */ - class NodeCreatorTool : public Tool + class NodeCreatorTool : public BuilderTool { + + //////////////////////////////////////////////TODO: switch to acyclic visitior!!!!!!!!!!!!! + public: virtual void treat (mobject::session::Clip& clip) ; virtual void treat (mobject::session::Effect& effect) ; diff --git a/src/proc/mobject/builder/segmentationtool.hpp b/src/proc/mobject/builder/segmentationtool.hpp index 0a58276ef..7ed4f65f2 100644 --- a/src/proc/mobject/builder/segmentationtool.hpp +++ b/src/proc/mobject/builder/segmentationtool.hpp @@ -27,7 +27,7 @@ #include #include "proc/mobject/buildable.hpp" -#include "proc/mobject/builder/tool.hpp" +#include "proc/mobject/builder/buildertool.hpp" #include "proc/mobject/session/segment.hpp" using std::list; @@ -54,8 +54,11 @@ namespace mobject * can be represented by automation solely, without the need * to change the node connections. */ - class SegmentationTool : public Tool + class SegmentationTool : public BuilderTool { + + //////////////////////////////////////////////TODO: switch to acyclic visitior!!!!!!!!!!!!! + public: void treat (mobject::session::Clip& clip) ; void treat (mobject::session::Effect& effect) ; diff --git a/src/proc/mobject/builder/toolfactory.cpp b/src/proc/mobject/builder/toolfactory.cpp index 6601162e3..456ee568b 100644 --- a/src/proc/mobject/builder/toolfactory.cpp +++ b/src/proc/mobject/builder/toolfactory.cpp @@ -30,7 +30,7 @@ namespace mobject - Tool & + BuilderTool & ToolFactory::configure () { } diff --git a/src/proc/mobject/builder/toolfactory.hpp b/src/proc/mobject/builder/toolfactory.hpp index 65b1a1eb2..d39b0e7c7 100644 --- a/src/proc/mobject/builder/toolfactory.hpp +++ b/src/proc/mobject/builder/toolfactory.hpp @@ -24,7 +24,7 @@ #ifndef MOBJECT_BUILDER_TOOLFACTORY_H #define MOBJECT_BUILDER_TOOLFACTORY_H -#include "proc/mobject/builder/tool.hpp" +#include "proc/mobject/builder/buildertool.hpp" @@ -37,7 +37,7 @@ namespace mobject class ToolFactory { public: - Tool & configure () ; + BuilderTool & configure () ; }; diff --git a/tests/50components.tests b/tests/50components.tests index 7435f21b0..10de4c7b4 100644 --- a/tests/50components.tests +++ b/tests/50components.tests @@ -182,3 +182,7 @@ out: --> remaining=SingleTestID spam --eggs END +PLANNED "VisitingTool_test" VisitingTool_test < + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +* *****************************************************/ + + +#include "common/test/run.hpp" +#include "common/visitor.hpp" +//#include "common/factory.hpp" +//#include "common/util.hpp" + +//#include +#include + +//using boost::format; +using std::string; +using std::cout; + + +namespace mobject + { + namespace builder + { + namespace test + { + + + + + /************************************************************************* + * @test our lib implementation of the acyclic visitor pattern. + * Defines a hierarchy of test classes to check the following cases + *
    • calling the correct visiting tool specialized function + * for given concrete hierarchy classes
    • + *
    • visiting tool not declaring to visit some class
    • + *
    • newly added class causes the catch-all to be invoked + * when visited by known visitor
    • + *
    + */ + class VisitingTool_test : public Test + { + virtual void run(Arg arg) + { + UNIMPLEMENTED ("testing the generic visitor pattern"); + known_visitor_known_class(); + visitor_not_visiting_some_class(); + visitor_treating_new_subclass(); + } + + void known_visitor_known_class() + { + UNIMPLEMENTED ("testing the generic visitor pattern"); + } + + void visitor_not_visiting_some_class() + { + UNIMPLEMENTED ("testing the generic visitor pattern"); + } + + void visitor_treating_new_subclass() + { + UNIMPLEMENTED ("testing the generic visitor pattern"); + } + }; + + + /** Register this test class... */ + LAUNCHER (VisitingTool_test, "unit common"); + + + + } // namespace test + + } // namespace builder + +} // namespace mobject diff --git a/tests/components/proc/mobject/builder/buildertooltest.cpp b/tests/components/proc/mobject/builder/buildertooltest.cpp new file mode 100644 index 000000000..6e277441a --- /dev/null +++ b/tests/components/proc/mobject/builder/buildertooltest.cpp @@ -0,0 +1,73 @@ +/* + BuilderTool(Test) - specialized form of the acyclic visitor + + Copyright (C) CinelerraCV + 2007, Hermann Vosseler + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +* *****************************************************/ + + +#include "common/test/run.hpp" +#include "proc/mobject/builder/buildertool.hpp" +//#include "common/factory.hpp" +//#include "common/util.hpp" + +//#include +#include + +//using boost::format; +using std::string; +using std::cout; + + +namespace mobject + { + namespace builder + { + namespace test + { + + + + + /******************************************************************* + * @test the generic visitor pattern specialized for treating + * MObjects in the builder. Because the generic visitor + * implementation is already covered by + * \link VisitingTool_test, it is sufficient to test + * the specialisation to the builder + * @todo work out what this means haha.... + */ + class BuilderTool_test : public Test + { + virtual void run(Arg arg) + { + UNIMPLEMENTED ("testing the visitor pattern for the builder"); + } + }; + + + /** Register this test class... */ + LAUNCHER (BuilderTool_test, "unit builder"); + + + + } // namespace test + + } // namespace builder + +} // namespace mobject diff --git a/uml/cinelerra3/128517 b/uml/cinelerra3/128517 index 60ea7208b..6a6b8ee00 100644 --- a/uml/cinelerra3/128517 +++ b/uml/cinelerra3/128517 @@ -1,6 +1,6 @@ format 40 "CommonLib" // CommonLib - revision 9 + revision 11 modified_by 5 "hiv" // class settings //class diagram settings @@ -253,6 +253,89 @@ ${inlines} package_name_in_tab default show_context default show_opaque_action_definition default auto_label_position default write_flow_label_horizontally default draw_all_relations default shadow default show_infonote default drawing_language default + class 140293 "Applicable" + abstract visibility package + nformals 1 + formal name "TAR" type "class" explicit_default_value "" + explicit_extends "" + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + idl_decl "" + explicit_switch_type "" + + operation 134405 "treat" + abstract cpp_virtual public explicit_return_type "" + nparams 1 + param inout name "visitable" explicit_type "TAR" + cpp_decl " ${comment}${friend}${static}${inline}${virtual}${type} ${name} ${(}${t0}& ${p0}${)}${const}${volatile} ${throw}${abstract};" + + + end + end + + class 140037 "Tool" + visibility package + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + idl_decl "" + explicit_switch_type "" + + operation 134533 "~Tool" + cpp_virtual public explicit_return_type "" + nparams 0 + cpp_decl " ${comment}${inline}${virtual}${name} ${(}${)}${volatile} ${throw} { };" + + + end + end + + class 140165 "Visitable" + abstract visibility package + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + idl_decl "" + explicit_switch_type "" + + operation 134661 "~Visitable" + cpp_virtual protected explicit_return_type "" + nparams 0 + cpp_decl " ${comment}${inline}${virtual}${name} ${(}${)}${volatile} ${throw}{};" + + + end + + operation 134789 "apply" + abstract cpp_virtual public explicit_return_type "void" + nparams 1 + param inout name "providedTool" type class_ref 140037 // Tool + cpp_decl " ${comment}${friend}${static}${inline}${virtual}${type} ${name} ${(}${t0}& ${p0}${)}${const}${volatile} ${throw}${abstract};" + + + end + + operation 134917 "dispatchOp" + class_operation public explicit_return_type "void" + nparams 2 + param inout name "target" explicit_type "TAR" + param inout name "t" type class_ref 140037 // Tool + cpp_decl " ${comment}${friend}${static}${inline}${virtual}${type} ${name} ${(}${t0}& ${p0}, ${t1}& ${p1}${)}${const}${volatile} ${throw}${abstract};" + + + end + end + class 134917 "Time" visibility public cpp_decl "${comment}${template}class ${name}${inherit} diff --git a/uml/cinelerra3/128901 b/uml/cinelerra3/128901 index c3a70f751..e4d919380 100644 --- a/uml/cinelerra3/128901 +++ b/uml/cinelerra3/128901 @@ -1,6 +1,6 @@ format 40 "Builder" // ProcessingLayer::MObject::Builder - revision 12 + revision 14 modified_by 5 "hiv" // class settings //class diagram settings @@ -219,7 +219,7 @@ ${inlines} explicit_switch_type "" operation 128773 "configure" - public return_type class_ref 134149 // Tool + public return_type class_ref 134149 // BuilderTool nparams 0 cpp_decl " ${comment}${friend}${static}${inline}${virtual}${type} ${name} ${(}${)}${const}${volatile} ${throw}${abstract};" cpp_def "${comment}${inline}${type} @@ -238,7 +238,7 @@ ${class}::${name} ${(}${)}${const}${volatile} ${throw}${staticnl} a package cpp default "#include in source" classrelation_ref 137221 // - b multiplicity "" parent class_ref 134149 // Tool + b multiplicity "" parent class_ref 134149 // BuilderTool end end @@ -340,24 +340,28 @@ ${members}}; explicit_switch_type "" operation 129669 "apply" - public explicit_return_type "void" + abstract cpp_virtual public explicit_return_type "void" nparams 1 - param inout name "provided_tool" explicit_type "Tool" + param inout name "providedTool" type class_ref 134149 // BuilderTool cpp_decl " ${comment}${friend}${static}${inline}${virtual}${type} ${name} ${(}${t0}& ${p0}${)}${const}${volatile} ${throw}${abstract};" - cpp_def "${comment}${inline}${type} -${class}::${name} ${(}${t0}& ${p0}${)}${const}${volatile} ${throw}${staticnl} -{ - ${body} -} - -" end + + classrelation 146437 // + relation 144261 ---|> + a public + cpp default "${type}" + classrelation_ref 146437 // + b multiplicity "" parent class_ref 140165 // Visitable + end end - class 134149 "Tool" + class 134149 "BuilderTool" abstract visibility public stereotype "interface" + nactuals 1 + actual class class_ref 140293 // Applicable + rank 0 explicit_value "" cpp_decl "${comment}${template}class ${name}${inherit} { ${members} }; @@ -373,25 +377,37 @@ ${members}}; comment "Used according to the visitor pattern: each Tool contains the concrete implementation for one task to be done to the various MObject classes" operation 129797 "treat" - public explicit_return_type "void" + abstract cpp_virtual public explicit_return_type "void" nparams 1 param in name "mElement" type class_ref 134021 // Buildable cpp_decl " ${comment}${friend}${static}${inline}${virtual}${type} ${name} ${(}const ${t0}& ${p0}${)}${const}${volatile} ${throw}${abstract};" - cpp_def "${comment}${inline}${type} -${class}::${name} ${(}const ${t0}& ${p0}${)}${const}${volatile} ${throw}${staticnl} -{ - ${body} -} - -" comment "This operation is to be overloaded for the specific MObject subclasses to be treated." end + + classrelation 146565 // + relation 144389 ---|> + a public + cpp default "${type}" + classrelation_ref 146565 // + b multiplicity "" parent class_ref 140037 // Tool + end + + classrelation 146693 // + relation 144517 ---|> + a public + cpp default "${type}" + classrelation_ref 146693 // + b multiplicity "" parent class_ref 140293 // Applicable + end end class 134277 "SegmentationTool" visibility package + nactuals 1 + actual class class_ref 140293 // Applicable + rank 0 explicit_value "" cpp_decl "${comment}${template}class ${name}${inherit} { ${members} }; @@ -407,7 +423,7 @@ ${inlines} a public cpp default "${type}" classrelation_ref 137605 // - b multiplicity "" parent class_ref 134149 // Tool + b multiplicity "" parent class_ref 134149 // BuilderTool end operation 129925 "treat" @@ -468,10 +484,21 @@ ${class}::${name} ${(}const ${t0}& ${p0}${)}${const}${volatile} ${throw}${static classrelation_ref 139013 // segments () b multiplicity "" parent class_ref 135173 // Segment end + + classrelation 146821 // + relation 144645 ---|> + a public + cpp default "${type}" + classrelation_ref 146821 // + b multiplicity "" parent class_ref 140293 // Applicable + end end class 134405 "NodeCreatorTool" visibility package + nactuals 1 + actual class class_ref 140293 // Applicable + rank 0 explicit_value "" cpp_decl "${comment}${template}class ${name}${inherit} { ${members} }; @@ -487,7 +514,7 @@ ${inlines} a public cpp default "${type}" classrelation_ref 137733 // - b multiplicity "" parent class_ref 134149 // Tool + b multiplicity "" parent class_ref 134149 // BuilderTool end operation 130309 "treat" @@ -562,6 +589,14 @@ ${class}::${name} ${(}${t0}& ${p0}${)}${const}${volatile} ${throw}${staticnl} idl_decl "" comment "holds the Processor (Render Engine Element) to be built by the current build step" end + + classrelation 146949 // + relation 144773 ---|> + a public + cpp default "${type}" + classrelation_ref 146949 // + b multiplicity "" parent class_ref 140293 // Applicable + end end end end diff --git a/uml/cinelerra3/129285 b/uml/cinelerra3/129285 index 26d96af1d..7b8ccd808 100644 --- a/uml/cinelerra3/129285 +++ b/uml/cinelerra3/129285 @@ -1,6 +1,6 @@ format 40 "ProcessingLayer" // ProcessingLayer - revision 7 + revision 9 modified_by 5 "hiv" // class settings //class diagram settings diff --git a/uml/cinelerra3/129285.diagram b/uml/cinelerra3/129285.diagram index b4b7dc366..0dbfb65e7 100644 --- a/uml/cinelerra3/129285.diagram +++ b/uml/cinelerra3/129285.diagram @@ -2,58 +2,75 @@ format 40 classcanvas 128005 class_ref 134021 // Buildable draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default - xyz 101 86 2000 + xyz 87 207 2000 end classcanvas 128133 class_ref 128517 // MObject draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default - xyz 80 228 2000 + xyz 81 349 2000 end -classcanvas 128517 class_ref 134149 // Tool +classcanvas 128517 class_ref 134149 // BuilderTool draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default - xyz 305 86 2000 + xyz 306 207 2000 end classcanvas 128645 class_ref 130693 // ToolFactory draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default - xyz 571 96 2000 + xyz 555 217 2000 end classcanvas 128901 class_ref 128901 // Clip draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default - xyz 146 404 2000 + xyz 147 525 2000 end classcanvas 129029 class_ref 129157 // Meta draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default - xyz 24 492 2000 + xyz 25 613 2000 end classcanvas 129157 class_ref 129029 // Effect draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default - xyz 105 472 2000 + xyz 106 593 2000 end classcanvas 129285 class_ref 129925 // Auto draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default - xyz 86 582 2005 + xyz 87 703 2005 end classcanvas 129413 class_ref 129669 // Label draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default - xyz 24 582 2000 + xyz 25 703 2000 end classcanvas 129541 class_ref 128773 // AbstractMO draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default - xyz 82 326 2000 + xyz 83 447 2000 end classcanvas 130565 class_ref 134277 // SegmentationTool draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default - xyz 303 362 2000 + xyz 304 483 2000 end classcanvas 130949 class_ref 134405 // NodeCreatorTool draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default - xyz 371 469 2004 + xyz 372 590 2004 end note 134277 "{ provided_tool.treat(this); }" - xyzwh 182 191 2000 159 39 + xyzwh 183 312 2000 159 39 classcanvas 134661 class_ref 135173 // Segment draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default - xyz 605 371 2000 + xyz 606 492 2000 end +classcanvas 134917 class_ref 140037 // Tool + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 370 53 2000 + end +classcanvas 135045 class_ref 140165 // Visitable + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 86 53 2000 + end +fragment 135173 "acyclic Visitor Lib" + xyzwh 69 17 1994 578 150 +end +classcanvas 135557 class_ref 140293 // Applicable + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + xyz 474 53 2005 + end +note 137861 "mixin for each concrete type to visit" + xyzwh 491 335 2008 137 53 relationcanvas 128261 relation_ref 135557 // from ref 128133 z 1999 to ref 128005 no_role_a no_role_b @@ -91,41 +108,66 @@ relationcanvas 130693 relation_ref 135941 // no_role_a no_role_b no_multiplicity_a no_multiplicity_b relationcanvas 131077 relation_ref 136069 // - from ref 130949 z 1999 to point 453 296 + from ref 130949 z 1999 to point 454 417 line 131205 z 1999 to ref 128517 no_role_a no_role_b no_multiplicity_a no_multiplicity_b relationcanvas 134789 relation_ref 137221 // - from ref 130565 z 1999 stereotype "<>" xyz 542 409 3000 to ref 134661 - role_a_pos 546 385 3000 no_role_b - multiplicity_a_pos 590 418 3000 no_multiplicity_b + from ref 130565 z 1999 stereotype "<>" xyz 543 530 3000 to ref 134661 + role_a_pos 547 506 3000 no_role_b + multiplicity_a_pos 591 539 3000 no_multiplicity_b +relationcanvas 135301 relation_ref 144261 // + from ref 128005 z 1999 to ref 135045 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 135429 relation_ref 144389 // + from ref 128517 z 1999 to ref 134917 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 135685 relation_ref 144517 // + from ref 128517 z 1999 to point 389 187 + line 136453 z 1999 to point 527 148 + line 136325 z 1999 to ref 135557 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 136581 relation_ref 144645 // + from ref 130565 z 1999 to point 388 404 + line 137221 z 1999 to point 527 337 + line 136965 z 1999 to ref 135557 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +relationcanvas 136709 relation_ref 144773 // + from ref 130949 z 2003 to point 527 463 + line 136837 z 2003 to ref 135557 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b line 131461 -_-_ - from ref 130565 z 1999 to point 301 409 - line 132101 z 1999 to point 264 407 + from ref 130565 z 1999 to point 302 530 + line 132101 z 1999 to point 265 528 line 132229 z 1999 to ref 128005 line 131589 -_-_ - from ref 130565 z 1999 to point 301 429 + from ref 130565 z 1999 to point 302 550 line 131845 z 1999 to ref 128901 line 131717 -_-_ - from ref 130565 z 1999 to point 300 449 + from ref 130565 z 1999 to point 301 570 line 131973 z 1999 to ref 129157 line 132357 -_-_ - from ref 128005 z 1999 to point 295 514 - line 132613 z 1999 to point 382 524 + from ref 128005 z 1999 to point 296 635 + line 132613 z 1999 to point 383 645 line 132485 z 1999 to ref 130949 line 132741 -_-_ - from ref 128901 z 1999 to point 294 534 - line 132997 z 1999 to point 382 544 + from ref 128901 z 1999 to point 295 655 + line 132997 z 1999 to point 383 665 line 132869 z 1999 to ref 130949 line 133125 -_-_ - from ref 129157 z 1999 to point 291 556 - line 133637 z 1999 to point 381 565 + from ref 129157 z 1999 to point 292 677 + line 133637 z 1999 to point 382 686 line 133765 z 1999 to ref 130949 line 133893 -_-_ - from ref 129285 z 2003 to point 287 578 - line 134149 z 2003 to point 380 585 + from ref 129285 z 2003 to point 288 699 + line 134149 z 2003 to point 381 706 line 134021 z 2003 to ref 130949 line 134405 -_-_ - from ref 128005 z 1999 to point 259 158 + from ref 128005 z 1999 to point 260 279 line 134533 z 1999 to ref 134277 end diff --git a/uml/cinelerra3/129413 b/uml/cinelerra3/129413 index fa3bd529e..efe41073b 100644 --- a/uml/cinelerra3/129413 +++ b/uml/cinelerra3/129413 @@ -1,6 +1,6 @@ format 40 "common" // design::codegen::common - revision 13 + revision 14 modified_by 5 "hiv" // class settings //class diagram settings @@ -39,6 +39,47 @@ Common library and helper classes" package_name_in_tab default show_context default write_horizontally default auto_label_position default draw_all_relations default shadow default draw_component_as_icon default show_component_req_prov default show_component_rea default comment "defines source files to be generated by BOUML" + artifact 139141 "visitor" + stereotype "source" + cpp_h "/* + ${NAME}.hpp - ${description} +@{CopyrightClaim}@{GPLHeader} +*/ + + +#ifndef ${NAMESPACE}_${NAME}_H +#define ${NAMESPACE}_${NAME}_H + +${includes} +${declarations} + + +${namespace_start} + +${definition} +${namespace_end} +#endif +" + cpp_src "/* + ${Name} - ${description} +@{CopyrightClaim}@{GPLHeader} +* *****************************************************/ + + +${includes} +${namespace_start} + + +${members} +${namespace_end}" + associated_classes + class_ref 140165 // Visitable + class_ref 140037 // Tool + class_ref 140293 // Applicable + end + comment "Acyclic Visitor library" + end + artifact 135813 "error" stereotype "source" cpp_h "/* @@ -163,4 +204,6 @@ ${namespace_end}" end package_ref 130821 // error + + package_ref 130949 // visitor end diff --git a/uml/cinelerra3/130565 b/uml/cinelerra3/130565 index 5da60b0f9..7061b3e4b 100644 --- a/uml/cinelerra3/130565 +++ b/uml/cinelerra3/130565 @@ -1,6 +1,6 @@ format 40 "builder" // design::codegen::proc::mobject::builder - revision 6 + revision 7 modified_by 5 "hiv" // class settings //class diagram settings @@ -156,7 +156,7 @@ ${namespace_end}" comment "building facility (implementation of the build process)" end - artifact 131205 "tool" + artifact 131205 "buildertool" stereotype "source" cpp_h "/* ${NAME}.hpp - ${description} @@ -190,7 +190,7 @@ ${namespace_start} ${members} ${namespace_end}" associated_classes - class_ref 134149 // Tool + class_ref 134149 // BuilderTool end comment "Interface, any tool for processing MObjects" end diff --git a/uml/cinelerra3/130949 b/uml/cinelerra3/130949 new file mode 100644 index 000000000..16a88747b --- /dev/null +++ b/uml/cinelerra3/130949 @@ -0,0 +1,33 @@ +format 40 +"visitor" // design::codegen::common::visitor + revision 1 + modified_by 5 "hiv" + // class settings + //class diagram settings + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default + //use case diagram settings + package_name_in_tab default show_context default auto_label_position default draw_all_relations default shadow default + //sequence diagram settings + show_full_operations_definition default write_horizontally default class_drawing_mode default drawing_language default draw_all_relations default shadow default + //collaboration diagram settings + show_full_operations_definition default show_hierarchical_rank default write_horizontally default drawing_language default package_name_in_tab default show_context default draw_all_relations default shadow default + //object diagram settings + write_horizontally default package_name_in_tab default show_context default auto_label_position default draw_all_relations default shadow default + //component diagram settings + package_name_in_tab default show_context default auto_label_position default draw_all_relations default shadow default + draw_component_as_icon default show_component_req_prov default show_component_rea default + //deployment diagram settings + package_name_in_tab default show_context default write_horizontally default auto_label_position default draw_all_relations default shadow default + draw_component_as_icon default show_component_req_prov default show_component_rea default + //state diagram settings + package_name_in_tab default show_context default auto_label_position default write_trans_label_horizontally default show_trans_definition default draw_all_relations default shadow default + show_activities default region_horizontally default drawing_language default + //activity diagram settings + package_name_in_tab default show_context default show_opaque_action_definition default auto_label_position default write_flow_label_horizontally default draw_all_relations default shadow default + show_infonote default drawing_language default + + cpp_h_dir "common" + cpp_src_dir "common" + cpp_namespace "cinelerra::visitor" + comment "sub-namespace for visitor library implementation" +end diff --git a/uml/cinelerra3/5.session b/uml/cinelerra3/5.session index 7ce3a373f..a2742eb7a 100644 --- a/uml/cinelerra3/5.session +++ b/uml/cinelerra3/5.session @@ -1,25 +1,30 @@ -window_sizes 1140 783 270 860 633 71 +window_sizes 1140 830 270 860 680 71 diagrams classdiagram_ref 130309 // Asset Kinds - 860 633 100 4 120 0 + 860 633 100 4 0 0 classdiagram_ref 128133 // Session structure 860 633 100 4 0 0 classdiagram_ref 128389 // Render Entities 688 506 100 4 120 0 - active classdiagram_ref 130437 // Media-Asset Relations - 859 616 100 4 0 0 + active classdiagram_ref 129285 // Builder Entities + 860 680 100 4 0 0 end show_stereotypes selected package_ref 129 // cinelerra3 open + deploymentview_ref 128261 // gen + deploymentview_ref 129029 // gen class_ref 137477 // Unknown class_ref 137605 // Preview class_ref 128645 // Placement class_ref 129413 // RelativeLocation class_ref 129541 // Allocation class_ref 139909 // LocatingPin - classview_ref 129029 // Interface - usecaseview_ref 128133 // usage + class_ref 134021 // Buildable + class_ref 134149 // BuilderTool + class_ref 134405 // NodeCreatorTool + classview_ref 128773 // error + class_ref 140165 // Visitable end end diff --git a/uml/cinelerra3/cinelerra3.prj b/uml/cinelerra3/cinelerra3.prj index a6f8a2a7f..47e92b6e0 100644 --- a/uml/cinelerra3/cinelerra3.prj +++ b/uml/cinelerra3/cinelerra3.prj @@ -1,6 +1,6 @@ format 40 "cinelerra3" - revision 37 + revision 39 modified_by 5 "hiv" cpp_root_dir "../../src/" diff --git a/wiki/renderengine.html b/wiki/renderengine.html index 3ffb052d6..dca965c99 100644 --- a/wiki/renderengine.html +++ b/wiki/renderengine.html @@ -703,7 +703,7 @@ Note, //we still have to work out how exactly building, rendering and playback w The Builder is part of the [[Builder Pattern|http://en.wikipedia.org/wiki/Builder_pattern]]
    -
    +
    * the MObjects implement //Buildable//
     * each Buildable can "recieve" a Tool object and aply it
     * the different Tool objects are iterated/mapped onto the list of MObjects in the [[Timeline]]
    @@ -712,7 +712,7 @@ The Builder is part of the [[Builder Pattern|http://en.wikipedia.org/wiki/Builde
       * so this design makes it easy to add new Tool subclasses, and within each Tool subclass, all operations on the different MObject classes are grouped together, so it is easy to see what is going on.
       * a given Tool instance can carry state while beeing iterated, so we don't need any global (or object-global) variables to hold the result of the build process
     
    -This programming technique is often refered to as //double dispatch// or //visitor//
    +This programming technique is often refered to as //double dispatch// or //visitor//. We use a special implementation variant of this pattern, known as "acyclic visitor". This technique was first invented by Robert Martin (1996) &mdash; our code is heavily inspired by the [[Loki library|http://loki-lib.sourceforge.net/]]. We use this approach not only for the builder, but also for carrying out operations on the objects in the EDL in a typesafe manner.
     {{red{TODO:flesh out the actual Operations needed}}}