You can subscribe to this list here.
| 2005 |
Jan
|
Feb
|
Mar
(67) |
Apr
(455) |
May
(202) |
Jun
(136) |
Jul
(203) |
Aug
(60) |
Sep
(88) |
Oct
(64) |
Nov
(56) |
Dec
(78) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2006 |
Jan
(271) |
Feb
(207) |
Mar
|
Apr
|
May
(167) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
From: Foster B. <fos...@us...> - 2005-04-18 21:15:56
|
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/documentation/sources/asl/concepts In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/documentation/sources/asl/concepts Added Files: concept_assignable.dox concept_convertible_to_bool.dox concept_convertible_to_function.dox concept_convertible_to_range.dox concept_defaultconstructible.dox concept_equalitycomparable.dox concept_lessthancomparable.dox concept_regular_type.dox concept_transform_function.dox defgroup_concepts.dox Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: defgroup_concepts.dox --- /*! \defgroup asl_concepts Concepts \ingroup asl_home */ --- NEW FILE: concept_transform_function.dox --- /*************************************************************************************************/ /* ADOBE CONFIDENTIAL ___________________ Copyright 2003 - 2003 Adobe Systems Incorporated All Rights Reserved. NOTICE: All information contained herein is, and remains the property of Adobe Systems Incorporated and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to Adobe Systems Incorporated and its suppliers and may be covered by U.S. and Foreign Patents, patents in process, and are protected by trade secret or copyright law. Dissemination of this information or reproduction of this material is strictly forbidden unless prior written permission is obtained from Adobe Systems Incorporated. */ /*************************************************************************************************/ /*! \defgroup concept_transform_function TransformFunction \ingroup asl_concepts \description A transformation (or transform) function is simply a Unary Function without side effects. That is, the use of the Unary Function does not change the state of the function object. For some algorithms it is required that the transform function return a writable result - in this case it must return a reference. \refinement_of - UnaryFunction \associated_types \notation <table> <tr> <td valign="top"><code>F</code></td> <td valign="top">A type that is a model of TransformFunction</td> </tr> <tr> <td valign="top"><code>X</code></td> <td valign="top">Argument type of F</td> </tr> <tr> <td valign="top"><code>Result</code></td> <td valign="top">Result type of F</td> </tr> <tr> <td valign="top"><code>f</code></td> <td valign="top">Object of type <code>F</code></td> </tr> <tr> <td valign="top"><code>x</code></td> <td valign="top">Object of type <code>X</code></td> </tr> </table> \definitions \valid_expressions \expression_semantics \complexity \invariants - The expression <code>f(x)</code> is <i>not</i> permitted to change <code>f</code>'s state. \models \notes \see_also \example Transform functions are typically used for the conversion of one type to another. An example: transforming a 3-space point into a 2-space point through a projection matrix; the projection matrix is the transform function, and its use does not modify the matrix. \example Another use of transform functions is to obtain an ordinal value for a complex data type. An example: Using a single member variable as the ordinal value for a class with several member variables, and sorting a vector of instances based on this ordinal value. The transformation only obtains the ordinal value and is not modified in any way. */ --- NEW FILE: concept_equalitycomparable.dox --- /*************************************************************************************************/ /* ADOBE CONFIDENTIAL ___________________ Copyright 2003 - 2003 Adobe Systems Incorporated All Rights Reserved. NOTICE: All information contained herein is, and remains the property of Adobe Systems Incorporated and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to Adobe Systems Incorporated and its suppliers and may be covered by U.S. and Foreign Patents, patents in process, and are protected by trade secret or copyright law. Dissemination of this information or reproduction of this material is strictly forbidden unless prior written permission is obtained from Adobe Systems Incorporated. */ /*************************************************************************************************/ /*! \defgroup stldoc_EqualityComparable EqualityComparable \ingroup asl_concepts \description A type is EqualityComparable if objects of that type can be compared for equality using <code>operator==</code>, and if <code>operator==</code> is an equivalence relation. \refinement_of \associated_types \notation <table> <tr> <td valign="top"><code>X</code></td> <td valign="top">A type that is a model of EqualityComparable</td> </tr> <tr> <td valign="top"><code>x</code>, <code>y</code>, <code>z</code></td> <td valign="top">Object of type <code>X</code></td> </tr> </table> \definitions \valid_expressions <table border> <tr> <th>Name</th><th>Expression</th><th>Type requirements</th><th>Return type</th> </tr> <tr> <td valign="top">Equality</td> <td valign="top"><code>x == y</code></td> <td valign="top"> </td> <td valign="top">Convertible to <code>bool</code></td> </tr> <tr> <td valign="top">Inequality</td> <td valign="top"><code>x != y</code></td> <td valign="top"> </td> <td valign="top">Convertible to <code>bool</code></td> </tr> </table> \expression_semantics <table border> <tr> <th>Name</th><th>Expression</th><th>Precondition</th><th>Semantics</th><th>Postcondition</th> </tr> <tr> <td valign="top">Equality</td> <td valign="top"><code>x == y</code></td> <td valign="top"><code>x</code> and <code>y</code> are in the domain of <code>==</code></td> <td valign="top"> </td> <td valign="top"> </td> </tr> <tr> <td valign="top">Inequality</td> <td valign="top"><code>x != y</code></td> <td valign="top"><code>x</code> and <code>y</code> are in the domain of <code>==</code></td> <td valign="top">Equivalent to <code>!(x == y)</code></td> <td valign="top"> </td> </tr> </table> \complexity \invariants <table border> <tr> <td valign="top">Identity</td> <td valign="top"><code>&x == &y</code> implies <code>x</code> == <code>y</code></td> </tr> <tr> <td valign="top">Reflexivity</td> <td valign="top"><code>x == x</code></td> </tr> <tr> <td valign="top">Symmetry</td> <td valign="top"><code>x == y</code> implies <code>y == x</code></td> </tr> <tr> <td valign="top">Transitivity</td> <td valign="top"><code>x == y</code> and <code>y == z</code> implies <code>x == z</code></td> </tr> </table> \models - int - <code>std::vector<T></code> \notes \see_also - \ref stldoc_LessThanComparable */ --- NEW FILE: concept_convertible_to_bool.dox --- /*************************************************************************************************/ /* ADOBE CONFIDENTIAL ___________________ Copyright 2003 - 2003 Adobe Systems Incorporated All Rights Reserved. NOTICE: All information contained herein is, and remains the property of Adobe Systems Incorporated and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to Adobe Systems Incorporated and its suppliers and may be covered by U.S. and Foreign Patents, patents in process, and are protected by trade secret or copyright law. Dissemination of this information or reproduction of this material is strictly forbidden unless prior written permission is obtained from Adobe Systems Incorporated. */ /*************************************************************************************************/ /*! \defgroup concept_convertible_to_bool ConvertibleToBool \ingroup asl_concepts \description A type is ConvertibleToBool if it can be implicitly converted to a <code>boolean</code> value. \refinement_of \associated_types \notation <table> <tr> <td valign="top"><code>X</code></td> <td valign="top">A type that is a model of ConvertibleToBool</td> </tr> <tr> <td valign="top"><code>x</code></td> <td valign="top">Object of type <code>X</code></td> </tr> <tr> <td valign="top"><code>b</code></td> <td valign="top">Object of type <code>bool</code></td> </tr> </table> \definitions \valid_expressions <table border> <tr> <th>Name</th><th>Expression</th><th>Type requirements</th><th>Return type</th> </tr> <tr> <td valign="top">ConvertibleToBool</td> <td valign="top"><code>bool b = x;</code></td> <td valign="top"> </td> <td valign="top">bool</td> </tr> <tr> <td valign="top">ConvertibleToBool</td> <td valign="top"><code>if (x)</code><br>-or-<br><code>if (!x)</code></td> <td valign="top"> </td> <td valign="top"> </td> </tr> </table> \expression_semantics <table border> <tr> <th>Name</th><th>Expression</th><th>Precondition</th><th>Semantics</th><th>Postcondition</th> </tr> <tr> <td valign="top">ConvertibleToBool</td> <td valign="top"><code>bool b = x;</code></td> <td valign="top"> </td> <td valign="top"> </td> <td valign="top"> </td> </tr> <tr> <td valign="top">ConvertibleToBool</td> <td valign="top"><code>if (x)</code><br>-or-<br><code>if (!x)</code></td> <td valign="top"> </td> <td valign="top"> </td> <td valign="top"> </td> </tr> </table> \complexity \invariants \models - a pointer - adobe::name_t \notes \see_also */ --- NEW FILE: concept_lessthancomparable.dox --- /*************************************************************************************************/ /* ADOBE CONFIDENTIAL ___________________ Copyright 2003 - 2003 Adobe Systems Incorporated All Rights Reserved. NOTICE: All information contained herein is, and remains the property of Adobe Systems Incorporated and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to Adobe Systems Incorporated and its suppliers and may be covered by U.S. and Foreign Patents, patents in process, and are protected by trade secret or copyright law. Dissemination of this information or reproduction of this material is strictly forbidden unless prior written permission is obtained from Adobe Systems Incorporated. */ /*************************************************************************************************/ /*! \defgroup stldoc_LessThanComparable LessThanComparable \ingroup asl_concepts \description A type is LessThanComparable if it is ordered: it must be possible to compare two objects of that type using <code>operator<</code>, and <code>operator<</code> must be a partial ordering. \refinement_of \associated_types \notation <table> <tr> <td valign="top"><code>X</code></td> <td valign="top">A type that is a model of LessThanComparable</td> </tr> <tr> <td valign="top"><code>x</code>, <code>y</code>, <code>z</code></td> <td valign="top">Object of type <code>X</code></td> </tr> </table> \definitions Consider the relation <code>!(x < y) && !(y < x)</code>. If this relation is transitive (that is, if <code>!(x < y) && !(y < x) && !(y < z) && !(z < y)</code> implies <code>!(x < z) && !(z < x)</code>), then it satisfies the mathematical definition of an equivalence relation. In this case, <code>operator<</code> is a <i>strict weak ordering</i>. \par If <code>operator<</code> is a strict weak ordering, and if each equivalence class has only a single element, then <code>operator<</code> is a <i>total ordering</i>. \valid_expressions <table border> <tr> <th>Name</th><th>Expression</th><th>Type requirements</th><th>Return type</th> </tr> <tr> <td valign="top">Less</td> <td valign="top"><code>x < y</code></td> <td valign="top"> </td> <td valign="top">Convertible to <code>bool</code></td> </tr> <tr> <td valign="top">Greater</td> <td valign="top"><code>x > y</code></td> <td valign="top"> </td> <td valign="top">Convertible to <code>bool</code></td> </tr> <tr> <td valign="top">Less or equal</td> <td valign="top"><code>x <= y</code></td> <td valign="top"> </td> <td valign="top">Convertible to <code>bool</code></td> </tr> <tr> <td valign="top">Greater or equal</td> <td valign="top"><code>x >= y</code></td> <td valign="top"> </td> <td valign="top">Convertible to <code>bool</code></td> </tr> </table> \expression_semantics <table border> <tr> <th>Name</th><th>Expression</th><th>Precondition</th><th>Semantics</th><th>Postcondition</th> </tr> <tr> <td valign="top">Less</td> <td valign="top"><code>x < y</code></td> <td valign="top"><code>x</code> and <code>y</code> are in the domain of <code><</code></td> <td valign="top"> </td> <td valign="top"> </td> </tr> <tr> <td valign="top">Greater</td> <td valign="top"><code>x > y</code></td> <td valign="top"><code>x</code> and <code>y</code> are in the domain of <code><</code></td> <td valign="top">Equivalent to <code>y < x</code> <A href="#1">[1]</A></td> <td valign="top"> </td> </tr> <tr> <td valign="top">Less or equal</td> <td valign="top"><code>x <= y</code></td> <td valign="top"><code>x</code> and <code>y</code> are in the domain of <code><</code></td> <td valign="top">Equivalent to <code>!(y < x)</code> <A href="#1">[1]</A></td> <td valign="top"> </td> </tr> <tr> <td valign="top">Greater or equal</td> <td valign="top"><code>x >= y</code></td> <td valign="top"><code>x</code> and <code>y</code> are in the domain of <code><</code></td> <td valign="top">Equivalent to <code>!(x < y)</code> <A href="#1">[1]</A></td> <td valign="top"> </td> </tr> </table> \complexity \invariants <table border> <tr> <td valign="top">Irreflexivity</td> <td valign="top"><code>x < x</code> must be false.</td> </tr> <tr> <td valign="top">Antisymmetry</td> <td valign="top"><code>x < y</code> implies !(y < x) <A href="#2">[2]</A></td> </tr> <tr> <td valign="top">Transitivity</td> <td valign="top"><code>x < y</code> and <code>y < z</code> implies <code>x < z</code> <A href="#3">[3]</A></td> </tr> </table> \models - int - adobe::name_t \notes <A name="1">[1]</A> Only <code>operator<</code> is fundamental; the other inequality operators are essentially syntactic sugar. \par <A name="2">[2]</A> Antisymmetry is a theorem, not an axiom: it follows from irreflexivity and transitivity. \par <A name="3">[3]</A> Because of irreflexivity and transitivity, <code>operator<</code> always satisfies the definition of a <i>partial ordering</i>. The definition of a <i>strict weak ordering</i> is stricter, and the definition of a <i>total ordering</i> is stricter still. \see_also - \ref stldoc_EqualityComparable */ --- NEW FILE: concept_convertible_to_range.dox --- /*************************************************************************************************/ /* ADOBE CONFIDENTIAL ___________________ Copyright 2002 - 2004 Adobe Systems Incorporated All Rights Reserved. NOTICE: All information contained herein is, and remains the property of Adobe Systems Incorporated and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to Adobe Systems Incorporated and its suppliers and may be covered by U.S. and Foreign Patents, patents in process, and are protected by trade secret or copyright law. Dissemination of this information or reproduction of this material is strictly forbidden unless prior written permission is obtained from Adobe Systems Incorporated. */ /*! \defgroup concept_convertible_to_range ConvertibleToRange \ingroup asl_concepts \description ConvertibleToRange denotes a sequence of the form: <code>[begin, end)</code>. The elements of the range are the beginning element to the element before the end element. The following are examples of ranges: - A <i>container</i>, denotes a range <code>[container.begin(), container.end())</code> - An <i>array</i>, denotes a range <code>[array[0], array[sizeof(array)/sizeof(array[0])])</code> - An <i>std::pair</i> of <i>iterators</i> denotes a range <code>[pair.first, pair.last)</code> \refinement_of \associated_types \notation <table> <tr> <td valign="top"><code>X</code></td> <td valign="top">A type that is a model of ConvertibleToRange</td> </tr> <tr> <td valign="top"><code>x</code></td> <td valign="top">Object of type <code>X</code></td> </tr> <tr> <td valign="top"><code>I</code></td> <td valign="top">A type for iterating over objects of type <code>X</code></td> </tr> <tr> <td valign="top"><code>p</code>, <code>q</code></td> <td valign="top">Objects of type <code>I</code></td> </tr> </table> \definitions \subpar Valid Iterator \c p is a <i>valid iterator</i> in \c x if it is a valid (nonsingular) iterator that is reachable from \c adobe::begin(x). \subpar Valid Range <code>[p, q)</code> is a <i>valid range</i> in \c x if \c p and \c q are valid iterators in \c x and if \c q is reachable from \c p. \valid_expressions \expression_semantics \complexity \invariants \subpar Range Size \c adobe::size(x) is equal to the distance from \c adobe::begin(x) to \c adobe::end(x). \subpar Completeness An algorithm that iterates through the range <code>[adobe::begin(x), adobe::end(x))</code> will pass through every element of \c x. <A href="#1">[1]</A> \notes <A name="1">[1]</A> The order in which the elements appear in any range is unspecified, even between two iterations where the range has had no intervening mutative operations. */ --- NEW FILE: concept_assignable.dox --- /*************************************************************************************************/ /* ADOBE CONFIDENTIAL ___________________ Copyright 2003 - 2003 Adobe Systems Incorporated All Rights Reserved. NOTICE: All information contained herein is, and remains the property of Adobe Systems Incorporated and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to Adobe Systems Incorporated and its suppliers and may be covered by U.S. and Foreign Patents, patents in process, and are protected by trade secret or copyright law. Dissemination of this information or reproduction of this material is strictly forbidden unless prior written permission is obtained from Adobe Systems Incorporated. */ /*************************************************************************************************/ /*! \defgroup stldoc_Assignable Assignable \ingroup asl_concepts \description A type is Assignable if it is possible to copy objects of that type and to assign values to variables. \refinement_of \associated_types \notation <table> <tr> <td valign="top"><code>X</code></td> <td valign="top">A type that is a model of Assignable</td> </tr> <tr> <td valign="top"><code>x</code>, <code>y</code></td> <td valign="top">Object of type <code>X</code></td> </tr> </table> \definitions \valid_expressions <table border> <tr> <th>Name</th><th>Expression</th><th>Type requirements</th><th>Return type</th> </tr> <tr> <td valign="top">Copy constructor</td> <td valign="top"><code>X(x)</code></td> <td valign="top"> </td> <td valign="top"><code>X</code></td> </tr> <tr> <td valign="top">Copy constructor</td> <td valign="top"> <pre>X x(y); X x = y; </pre> </td> <td valign="top"> </td> <td valign="top"> </td> </tr> <tr> <td valign="top">Assignment</td> <td valign="top"><code>x = y</code> <A href="#1">[1]</A></td> <td valign="top"> </td> <td valign="top"><code>X&</code></td> </tr> <tr> <td valign="top">Swap</td> <td valign="top"><code>adobe::swap(x,y)</code></td> <td valign="top"> </td> <td valign="top"><code>void</code></td> </tr> </table> \expression_semantics <table border> <tr> <th>Name</th><th>Expression</th><th>Precondition</th><th>Semantics</th><th>Postcondition</th> </tr> <tr> <td valign="top">Copy constructor</td> <td valign="top"><code>X(x)</code></td> <td valign="top"> </td> <td valign="top"> </td> <td valign="top"><code>X(x)</code> is a copy of <code>x</code> <A href="#2">[2]</A></td> </tr> <tr> <td valign="top">Copy constructor</td> <td valign="top"><code>X(x)</code></td> <td valign="top"> </td> <td valign="top"> </td> <td valign="top"><code>X(x)</code> is a copy of <code>x</code> <A href="#2">[2]</A></td> </tr> <tr> <td valign="top">Copy constructor</td> <td valign="top"> <pre>X x(y); X x = y; </pre> </td> <td valign="top"> </td> <td valign="top"> </td> <td valign="top"><code>x</code> is a copy of <code>y</code> <A href="#2">[2]</A></td> </tr> <tr> <td valign="top">Assignment</td> <td valign="top"><code>x</code> = <code>y</code> <A href="#1">[1]</A></td> <td valign="top"> </td> <td valign="top"> </td> <td valign="top"><code>x</code> is a copy of <code>y</code> <A href="#2">[2]</A></td> </tr> <tr> <td valign="top">Swap</td> <td valign="top"><code>adobe::swap(x,y)</code><A href="#3">[3]</A></td> <td valign="top"> </td> <td valign="top"> Equivalent to <pre>{ X tmp = x; x = y; y = tmp; } </pre> </td> <td valign="top"> </td> </tr> </table> \complexity \invariants \models - int \notes <A name="1">[1]</A> One implication of this requirement is that a <code>const</code> type is not Assignable. For example, <code>const int</code> is not Assignable: if <code>x</code> is declared to be of type <code>const int</code>, then <code>x = 7</code> is illegal. Similarly, the type <code>pair<const int, int></code> is not Assignable. \par <A name="2">[2]</A> The reason this says "<code>x</code> is a copy of <code>y</code>", rather than "<code>x == y</code>", is that <code>operator==</code> is not necessarily defined: equality is not a requirement of Assignable. If the type <code>X</code> is \ref stldoc_EqualityComparable as well as Assignable, then a copy of <code>x</code> should compare equal to <code>x</code>. \par <A name="3">[3]</A> \c adobe::swap will not throw an exception for an assignable type. For types with remote parts, \c adobe::swap must be specialized to swap the remote parts. <!--Please see the documentation on adobe::swap for more information.--> \par <A name="4">[4]</A> It is assumed that adobe::swap() will not throw an exception. Items with remote parts much specialize swap as described in \ref swap. \see_also - \ref stldoc_DefaultConstructible - \ref stldoc_EqualityComparable */ --- NEW FILE: concept_regular_type.dox --- /*************************************************************************************************/ /* ADOBE CONFIDENTIAL ___________________ Copyright 2003 - 2003 Adobe Systems Incorporated All Rights Reserved. NOTICE: All information contained herein is, and remains the property of Adobe Systems Incorporated and its suppliers, if any. the intellectual and technical concepts contained herein are proprietary to Adobe Systems Incorporated and its suppliers and may be covered by U.S. and Foreign Patents, patents in process, and are protected by trade secret or copyright law. Dissemination of this information or reproduction of this material is strictly forbidden unless prior written permission is obtained from Adobe Systems Incorporated. */ /*************************************************************************************************/ /*! \defgroup concept_regular_type RegularType \ingroup asl_concepts \description At the most fundamental level, RegularType is any type that "behaves like <code>int</code>". That is to say that when you copy a RegularType, it copies all the parts, both local and remote. This is also known as a Value because when you copy a Value you are copying the entirety of the Value, not just a pointer (or some other type of reference) to it. \refinement_of - \ref stldoc_DefaultConstructible - \ref stldoc_Assignable - \ref stldoc_EqualityComparable \notation \valid_expressions All expressions that match the above concepts are valid. \expression_semantics All expression semantics that match the above concepts are valid. \models - adobe::name_t - adobe::copy_on_write \notes \see_also - Alex Stepanov's paper on the <a href="http://www.stepanovpapers.com/DeSt98.pdf">concept of regular types</a>. */ --- NEW FILE: concept_defaultconstructible.dox --- /*************************************************************************************************/ /* ADOBE CONFIDENTIAL ___________________ Copyright 2003 - 2003 Adobe Systems Incorporated All Rights Reserved. NOTICE: All information contained herein is, and remains the property of Adobe Systems Incorporated and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to Adobe Systems Incorporated and its suppliers and may be covered by U.S. and Foreign Patents, patents in process, and are protected by trade secret or copyright law. Dissemination of this information or reproduction of this material is strictly forbidden unless prior written permission is obtained from Adobe Systems Incorporated. */ /*************************************************************************************************/ /*! \defgroup stldoc_DefaultConstructible DefaultConstructible \ingroup asl_concepts \description A type is DefaultConstructible if it has a default constructor, that is, if it is possible to construct an object of that type without initializing the object to any particular value. \refinement_of \associated_types \notation <table> <tr> <td valign="top"><code>X</code></td> <td valign="top">A type that is a model of DefaultConstructible</td> </tr> <tr> <td valign="top"><code>x</code></td> <td valign="top">An object of type <code>X</code></td> </tr> </table> \definitions \valid_expressions <table border> <tr> <th>Name</th><th>Expression</th><th>Type requirements</th><th>Return type</th> </tr> <tr> <td valign="top">Default constructor</td> <td valign="top"><code>X()</code></td> <td valign="top"> </td> <td valign="top"><code>X</code></td> </tr> <tr> <td valign="top">Default constructor</td> <td valign="top"><code>X x;</code> <A href="#1">[1]</A></td> <td valign="top"> </td> <td valign="top"> </td> </tr> </table> \expression_semantics <table border> <tr> <th>Name</th><th>Expression</th><th>Precondition</th><th>Semantics</th><th>Postcondition</th> </tr> <tr> <td valign="top">Default constructor</td> <td valign="top"><code>X()</code></td> <td valign="top"> </td> <td valign="top"> </td> <td valign="top"> </td> </tr> <tr> <td valign="top">Default constructor</td> <td valign="top"><code>X x;</code></td> <td valign="top"> </td> <td valign="top"> </td> <td valign="top"> </td> </tr> </table> \complexity \models - int - adobe::name_t - adobe::copy_on_write \notes <A name="1">[1]</A> The form <code>X x = X()</code> is not guaranteed to be a valid expression, because it uses a copy constructor. A type that is DefaultConstructible is not necessarily \ref stldoc_Assignable \see_also - \ref stldoc_Assignable */ --- NEW FILE: concept_convertible_to_function.dox --- /*************************************************************************************************/ /* ADOBE CONFIDENTIAL ___________________ Copyright 2003 - 2003 Adobe Systems Incorporated All Rights Reserved. NOTICE: All information contained herein is, and remains the property of Adobe Systems Incorporated and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to Adobe Systems Incorporated and its suppliers and may be covered by U.S. and Foreign Patents, patents in process, and are protected by trade secret or copyright law. Dissemination of this information or reproduction of this material is strictly forbidden unless prior written permission is obtained from Adobe Systems Incorporated. */ /*************************************************************************************************/ /*! \defgroup concept_convertible_to_function ConvertibleToFunction \ingroup asl_concepts \description A ConvertibleToFunction is simply something which can be invoked using function notation - or something that \c boost::bind can convert to a function. Specifically, a ConvertibleToFunction can be: - A pointer to a function - A pointer to a class or struct data member (argument is a pointer or a reference to a struct/class instance) - A pointer to a class or struct member function (first argument is a pointer or a reference to a struct/class instance; Member function arguments follow in order) - A \c boost::reference_wrapper to a ConvertibleToFunction - A function object Where functions are passed as template parameters in the Adobe Source Libraries, any ConvertibleToFunction may be used. The idea is that <code>boost::bind(x, ...);</code> is a valid expression where <code>...</code> are arguments to <code>x</code>. <code>x</code>, in this case, is ConvertibleToFunction. \refinement_of \associated_types \notation <table> <tr> <td valign="top"><code>F</code></td> <td valign="top">A type that is a model of ConvertibleToFunction</td> </tr> <tr> <td valign="top"><code>x1...xn</code></td> <td valign="top">An optional argument list for the type that is a model of ConvertibleToFunction</td> </tr> <tr> <td valign="top"><code>f</code></td> <td valign="top">Object of type <code>F</code></td> </tr> </table> \definitions \valid_expressions <table border> <tr> <th>Name</th><th>Expression</th><th>Type requirements</th><th>Return type</th> </tr> <tr> <td valign="top">Convertible</td> <td valign="top"><code>boost::bind(&f, x1...xn);</code></td> <td valign="top"> </td> <td valign="top">An invokable <code>boost::function</code> whose template argument is the function signature of <code>f</code></td> </tr> </table> \expression_semantics \complexity \invariants \models - Anything that is acceptable to <code>boost::bind</code>. \example Given a \c vector of structs... \par \code struct my_struct { bool value_m; } std::vector<my_struct> my_vector; // Code here to fill the vector with some bools... \endcode \par Writing the following would be an error: \par \code iter = std::find_if(my_vector.begin(), my_vector.end(), &my_struct::value_m); // Error! \endcode \par But because a pointer to a member is ConvertibleToFunction, and in this case the function meets the requirements of a predicate (that is, the accessing of \c value_m will return either \c true or \c false) we can write: \par \code iter = adobe::find_if(my_vector.begin(), my_vector.end(), &my_struct::value_m); // works! \endcode \par Further, because \c vector meets the requirements of a \ref concept_convertible_to_range, this can be shortened to: \par \code iter = adobe::find_if(my_vector, &my_struct::value_m); // also works! \endcode */ |
|
From: Foster B. <fos...@us...> - 2005-04-18 21:15:56
|
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/documentation/sources/asl/related/images/originals In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/documentation/sources/asl/related/images/originals Added Files: adam_and_eve.graffle adam_mvc_design.graffle codebase.graffle edit_text_example.graffle parameter_flow.graffle Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: adam_mvc_design.graffle --- <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CanvasColor</key> <dict> <key>a</key> <string>1</string> <key>w</key> <string>1</string> </dict> <key>ColumnAlign</key> <integer>0</integer> <key>ColumnSpacing</key> <real>36</real> <key>GraphDocumentVersion</key> <integer>2</integer> <key>GraphicsList</key> <array> <dict> <key>Class</key> <string>LineGraphic</string> <key>Head</key> <dict> <key>ID</key> <integer>99</integer> <key>Info</key> <integer>4</integer> </dict> <key>ID</key> <integer>121</integer> <key>Points</key> <array> <string>{306, 288}</string> <string>{368.16, 202.253}</string> </array> <key>Style</key> <dict> <key>stroke</key> <dict> <key>HeadArrow</key> <string>FilledArrow</string> <key>LineType</key> <integer>1</integer> <key>TailArrow</key> <string>0</string> </dict> </dict> <key>Tail</key> <dict> <key>ID</key> <integer>113</integer> <key>Info</key> <integer>3</integer> </dict> </dict> <dict> <key>Class</key> <string>LineGraphic</string> <key>Head</key> <dict> <key>ID</key> <integer>100</integer> <key>Info</key> <integer>4</integer> </dict> <key>ID</key> <integer>120</integer> <key>Points</key> <array> <string>{306, 288}</string> <string>{368.16, 256.253}</string> </array> <key>Style</key> <dict> <key>stroke</key> <dict> <key>HeadArrow</key> <string>FilledArrow</string> <key>LineType</key> <integer>1</integer> <key>TailArrow</key> <string>0</string> </dict> </dict> <key>Tail</key> <dict> <key>ID</key> <integer>113</integer> <key>Info</key> <integer>3</integer> </dict> </dict> <dict> <key>Class</key> <string>LineGraphic</string> <key>Head</key> <dict> <key>ID</key> <integer>109</integer> <key>Info</key> <integer>4</integer> </dict> <key>ID</key> <integer>119</integer> <key>Points</key> <array> <string>{306, 288}</string> <string>{369, 346.25}</string> </array> <key>Style</key> <dict> <key>stroke</key> <dict> <key>HeadArrow</key> <string>FilledArrow</string> <key>LineType</key> <integer>1</integer> <key>TailArrow</key> <string>0</string> </dict> </dict> <key>Tail</key> <dict> <key>ID</key> <integer>113</integer> <key>Info</key> <integer>3</integer> </dict> </dict> <dict> <key>Class</key> <string>LineGraphic</string> <key>Head</key> <dict> <key>ID</key> <integer>113</integer> <key>Info</key> <integer>1</integer> </dict> <key>ID</key> <integer>118</integer> <key>Points</key> <array> <string>{260.25, 360}</string> <string>{261, 315}</string> </array> <key>Style</key> <dict> <key>stroke</key> <dict> <key>HeadArrow</key> <string>FilledArrow</string> <key>LineType</key> <integer>1</integer> <key>TailArrow</key> <string>0</string> </dict> </dict> <key>Tail</key> <dict> <key>ID</key> <integer>112</integer> <key>Info</key> <integer>2</integer> </dict> </dict> <dict> <key>Class</key> <string>LineGraphic</string> <key>Head</key> <dict> <key>ID</key> <integer>113</integer> <key>Info</key> <integer>4</integer> </dict> <key>ID</key> <integer>117</integer> <key>Points</key> <array> <string>{144, 373.248}</string> <string>{216, 288}</string> </array> <key>Style</key> <dict> <key>stroke</key> <dict> <key>HeadArrow</key> <string>FilledArrow</string> <key>LineType</key> <integer>1</integer> <key>TailArrow</key> <string>0</string> </dict> </dict> <key>Tail</key> <dict> <key>ID</key> <integer>106</integer> <key>Info</key> <integer>3</integer> </dict> </dict> <dict> <key>Class</key> <string>LineGraphic</string> <key>Head</key> <dict> <key>ID</key> <integer>113</integer> <key>Info</key> <integer>4</integer> </dict> <key>ID</key> <integer>116</integer> <key>Points</key> <array> <string>{144, 319.248}</string> <string>{216, 288}</string> </array> <key>Style</key> <dict> <key>stroke</key> <dict> <key>HeadArrow</key> <string>FilledArrow</string> <key>LineType</key> <integer>1</integer> <key>TailArrow</key> <string>0</string> </dict> </dict> <key>Tail</key> <dict> <key>ID</key> <integer>103</integer> <key>Info</key> <integer>3</integer> </dict> </dict> <dict> <key>Class</key> <string>LineGraphic</string> <key>Head</key> <dict> <key>ID</key> <integer>113</integer> <key>Info</key> <integer>4</integer> </dict> <key>ID</key> <integer>115</integer> <key>Points</key> <array> <string>{145, 256.248}</string> <string>{216, 288}</string> </array> <key>Style</key> <dict> <key>stroke</key> <dict> <key>HeadArrow</key> <string>FilledArrow</string> <key>LineType</key> <integer>1</integer> <key>TailArrow</key> <string>0</string> </dict> </dict> <key>Tail</key> <dict> <key>ID</key> <integer>102</integer> <key>Info</key> <integer>3</integer> </dict> </dict> <dict> <key>Class</key> <string>LineGraphic</string> <key>Head</key> <dict> <key>ID</key> <integer>113</integer> <key>Info</key> <integer>4</integer> </dict> <key>ID</key> <integer>114</integer> <key>Points</key> <array> <string>{145, 202.248}</string> <string>{216, 288}</string> </array> <key>Style</key> <dict> <key>stroke</key> <dict> <key>HeadArrow</key> <string>FilledArrow</string> <key>LineType</key> <integer>1</integer> <key>TailArrow</key> <string>0</string> </dict> </dict> <key>Tail</key> <dict> <key>ID</key> <integer>101</integer> <key>Info</key> <integer>3</integer> </dict> </dict> <dict> <key>Bounds</key> <string>{{216, 261}, {90, 54}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>ID</key> <integer>113</integer> <key>Magnets</key> <array> <string>{0, 1}</string> <string>{0, -1}</string> <string>{1, 0}</string> <string>{-1, 0}</string> </array> <key>Shape</key> <string>Subprocess</string> <key>Text</key> <dict> <key>Text</key> <string>{\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc \f0\fs20 \cf0 Adam}</string> </dict> </dict> <dict> <key>Bounds</key> <string>{{224, 360}, {73, 54}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>ID</key> <integer>112</integer> <key>Magnets</key> <array> <string>{0, 1}</string> <string>{0, -1}</string> <string>{1, 0}</string> <string>{-1, 0}</string> </array> <key>Shape</key> <string>DocumentShape</string> <key>Text</key> <dict> <key>Text</key> <string>{\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc \f0\fs20 \cf0 Document\ Model}</string> </dict> </dict> <dict> <key>Class</key> <string>Group</string> <key>Graphics</key> <array> <dict> <key>Bounds</key> <string>{{369, 324}, {14.4, 45}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>HFlip</key> <string>YES</string> <key>ID</key> <integer>110</integer> <key>Shape</key> <string>Rectangle</string> </dict> <dict> <key>Bounds</key> <string>{{369, 324}, {72, 45}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>HFlip</key> <string>YES</string> <key>ID</key> <integer>111</integer> <key>Shape</key> <string>DisplayShape</string> <key>Text</key> <dict> <key>Text</key> <string>{\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc \f0\fs20 \cf0 To Process}</string> </dict> </dict> </array> <key>GroupConnect</key> <string>YES</string> <key>ID</key> <integer>109</integer> <key>Magnets</key> <array> <string>{0, 1}</string> <string>{0, -1}</string> <string>{1, 0}</string> <string>{-1, 0}</string> </array> </dict> <dict> <key>Class</key> <string>Group</string> <key>Graphics</key> <array> <dict> <key>Bounds</key> <string>{{131.4, 351}, {12.6, 45}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>ID</key> <integer>107</integer> <key>Shape</key> <string>Rectangle</string> </dict> <dict> <key>Bounds</key> <string>{{81, 351}, {63, 45}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>ID</key> <integer>108</integer> <key>Shape</key> <string>DisplayShape</string> <key>Text</key> <dict> <key>Text</key> <string>{\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc \f0\fs20 \cf0 From Script}</string> </dict> </dict> </array> <key>GroupConnect</key> <string>YES</string> <key>ID</key> <integer>106</integer> <key>Magnets</key> <array> <string>{0, 1}</string> <string>{0, -1}</string> <string>{1, 0}</string> <string>{-1, 0}</string> </array> </dict> <dict> <key>Class</key> <string>Group</string> <key>Graphics</key> <array> <dict> <key>Bounds</key> <string>{{131.4, 297}, {12.6, 45}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>ID</key> <integer>104</integer> <key>Shape</key> <string>Rectangle</string> </dict> <dict> <key>Bounds</key> <string>{{81, 297}, {63, 45}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>ID</key> <integer>105</integer> <key>Shape</key> <string>DisplayShape</string> <key>Text</key> <dict> <key>Text</key> <string>{\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc \f0\fs20 \cf0 From Default}</string> </dict> </dict> </array> <key>GroupConnect</key> <string>YES</string> <key>ID</key> <integer>103</integer> <key>Magnets</key> <array> <string>{0, 1}</string> <string>{0, -1}</string> <string>{1, 0}</string> <string>{-1, 0}</string> </array> </dict> <dict> <key>Bounds</key> <string>{{72, 234}, {73, 45}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>ID</key> <integer>102</integer> <key>Magnets</key> <array> <string>{0, 1}</string> <string>{0, -1}</string> <string>{1, 0}</string> <string>{-1, 0}</string> </array> <key>Shape</key> <string>SlopedRect</string> <key>Text</key> <dict> <key>Text</key> <string>{\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc \f0\fs20 \cf0 Popup}</string> </dict> </dict> <dict> <key>Bounds</key> <string>{{72, 180}, {73, 45}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>ID</key> <integer>101</integer> <key>Magnets</key> <array> <string>{0, 1}</string> <string>{0, -1}</string> <string>{1, 0}</string> <string>{-1, 0}</string> </array> <key>Shape</key> <string>SlopedRect</string> <key>Text</key> <dict> <key>Text</key> <string>{\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc \f0\fs20 \cf0 Edit Text}</string> </dict> </dict> <dict> <key>Bounds</key> <string>{{368, 234}, {73, 45}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>ID</key> <integer>100</integer> <key>Magnets</key> <array> <string>{0, 1}</string> <string>{0, -1}</string> <string>{1, 0}</string> <string>{-1, 0}</string> </array> <key>Shape</key> <string>DisplayShape</string> <key>Text</key> <dict> <key>Text</key> <string>{\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc \f0\fs20 \cf0 Popup}</string> </dict> </dict> <dict> <key>Bounds</key> <string>{{368, 180}, {73, 45}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>ID</key> <integer>99</integer> <key>Magnets</key> <array> <string>{0, 1}</string> <string>{0, -1}</string> <string>{1, 0}</string> <string>{-1, 0}</string> </array> <key>Shape</key> <string>DisplayShape</string> <key>Text</key> <dict> <key>Text</key> <string>{\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc \f0\fs20 \cf0 Edit Text}</string> </dict> </dict> </array> <key>GridInfo</key> <dict/> <key>HPages</key> <integer>1</integer> <key>ImageCounter</key> <integer>1</integer> <key>IsPalette</key> <string>NO</string> <key>Layers</key> <array> <dict> <key>Lock</key> <string>NO</string> <key>Name</key> <string>Layer 1</string> <key>Print</key> <string>YES</string> <key>View</key> <string>YES</string> </dict> </array> <key>LayoutInfo</key> <dict> <key>AutoAdjust</key> <string>YES</string> <key>MagneticFieldCenter</key> <string>{0, 0}</string> </dict> <key>MagnetsEnabled</key> <string>YES</string> <key>PageBreakColor</key> <dict> <key>a</key> <string>1</string> <key>w</key> <string>0.666667</string> </dict> <key>PageBreaks</key> <string>YES</string> <key>PageSetup</key> <data> BAt0eXBlZHN0cmVhbYED6IQBQISEhAtOU1ByaW50SW5mbwGEhAhOU09iamVjdACFkoSE hBNOU011dGFibGVEaWN0aW9uYXJ5AISEDE5TRGljdGlvbmFyeQCUhAFpFJKEhIQITlNT dHJpbmcBlIQBKxBOU0pvYkRpc3Bvc2l0aW9uhpKEmZkPTlNQcmludFNwb29sSm9ihpKE mZkLTlNQYXBlclNpemWGkoSEhAdOU1ZhbHVlAJSEASqEhAx7X05TU2l6ZT1mZn2cgQJk gQMYhpKEmZkZTlNQcmludFJldmVyc2VPcmllbnRhdGlvboaShISECE5TTnVtYmVyAJ2b hJeXAIaShJmZFE5TVmVydGljYWxQYWdpbmF0aW9uhpKEoZuilwCGkoSZmRROU1ZlcnRp Y2FsbHlDZW50ZXJlZIaShKGbopcBhpKEmZkOTlNQTVBhZ2VGb3JtYXSGkoSEhAZOU0Rh dGEAlJeBIaqEB1s4NjE4Y108P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYt OCI/Pgo8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZSBDb21wdXRlci8vRFRE IFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5 TGlzdC0xLjAuZHRkIj4KPHBsaXN0IHZlcnNpb249IjEuMCI+CjxkaWN0PgoJPGtleT5j b20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5Gb3JtYXR0aW5nUHJpbnRlcjwva2V5PgoJ PGRpY3Q+CgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4K CQk8c3RyaW5nPmNvbS5hcHBsZS5wcmludGluZ21hbmFnZXI8L3N0cmluZz4KCQk8a2V5 PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk+CgkJPGFycmF5PgoJ CQk8ZGljdD4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuRm9ybWF0 dGluZ1ByaW50ZXI8L2tleT4KCQkJCTxzdHJpbmc+QWRvYmVQREY8L3N0cmluZz4KCQkJ CTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jbGllbnQ8L2tleT4KCQkJCTxzdHJp bmc+Y29tLmFwcGxlLnByaW50aW5nbWFuYWdlcjwvc3RyaW5nPgoJCQkJPGtleT5jb20u YXBwbGUucHJpbnQudGlja2V0Lm1vZERhdGU8L2tleT4KCQkJCTxkYXRlPjIwMDQtMTIt MDJUMDA6NTk6MDlaPC9kYXRlPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0 LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KCQkJPC9kaWN0 PgoJCTwvYXJyYXk+Cgk8L2RpY3Q+Cgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9y bWF0LlBNSG9yaXpvbnRhbFJlczwva2V5PgoJPGRpY3Q+CgkJPGtleT5jb20uYXBwbGUu cHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5wcmlu dGluZ21hbmFnZXI8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQu aXRlbUFycmF5PC9rZXk+CgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk+Y29tLmFw cGxlLnByaW50LlBhZ2VGb3JtYXQuUE1Ib3Jpem9udGFsUmVzPC9rZXk+CgkJCQk8cmVh bD43MjwvcmVhbD4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jbGllbnQ8 L2tleT4KCQkJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50aW5nbWFuYWdlcjwvc3RyaW5n PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lm1vZERhdGU8L2tleT4KCQkJ CTxkYXRlPjIwMDQtMTItMDJUMDA6NTk6MDlaPC9kYXRlPgoJCQkJPGtleT5jb20uYXBw bGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI+MDwvaW50 ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk+Cgk8L2RpY3Q+Cgk8a2V5PmNvbS5hcHBs ZS5wcmludC5QYWdlRm9ybWF0LlBNT3JpZW50YXRpb248L2tleT4KCTxkaWN0PgoJCTxr ZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk+CgkJPHN0cmluZz5j b20uYXBwbGUucHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+CgkJPGtleT5jb20uYXBwbGUu cHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4KCQkJPGRpY3Q+CgkJ CQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNT3JpZW50YXRpb248L2tl eT4KCQkJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CgkJCQk8a2V5PmNvbS5hcHBsZS5wcmlu dC50aWNrZXQuY2xpZW50PC9rZXk+CgkJCQk8c3RyaW5nPmNvbS5hcHBsZS5wcmludGlu Z21hbmFnZXI8L3N0cmluZz4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5t b2REYXRlPC9rZXk+CgkJCQk8ZGF0ZT4yMDA0LTEyLTAyVDAwOjU5OjA5WjwvZGF0ZT4K CQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJ CTxpbnRlZ2VyPjA8L2ludGVnZXI+CgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0 PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVNjYWxpbmc8L2tleT4K CTxkaWN0PgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk+ CgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+CgkJPGtl eT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4K CQkJPGRpY3Q+CgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNU2Nh bGluZzwva2V5PgoJCQkJPHJlYWw+MTwvcmVhbD4KCQkJCTxrZXk+Y29tLmFwcGxlLnBy aW50LnRpY2tldC5jbGllbnQ8L2tleT4KCQkJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50 aW5nbWFuYWdlcjwvc3RyaW5nPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0 Lm1vZERhdGU8L2tleT4KCQkJCTxkYXRlPjIwMDQtMTItMDJUMDA6NTk6MDlaPC9kYXRl PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJ CQkJPGludGVnZXI+MDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk+Cgk8L2Rp Y3Q+Cgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8 L2tleT4KCTxkaWN0PgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9y PC9rZXk+CgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+ CgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxh cnJheT4KCQkJPGRpY3Q+CgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0 LlBNVmVydGljYWxSZXM8L2tleT4KCQkJCTxyZWFsPjcyPC9yZWFsPgoJCQkJPGtleT5j b20uYXBwbGUucHJpbnQudGlja2V0LmNsaWVudDwva2V5PgoJCQkJPHN0cmluZz5jb20u YXBwbGUucHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+CgkJCQk8a2V5PmNvbS5hcHBsZS5w cmludC50aWNrZXQubW9kRGF0ZTwva2V5PgoJCQkJPGRhdGU+MjAwNC0xMi0wMlQwMDo1 OTowOVo8L2RhdGU+CgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVG bGFnPC9rZXk+CgkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQk8L2RpY3Q+CgkJPC9h cnJheT4KCTwvZGljdD4KCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1W ZXJ0aWNhbFNjYWxpbmc8L2tleT4KCTxkaWN0PgoJCTxrZXk+Y29tLmFwcGxlLnByaW50 LnRpY2tldC5jcmVhdG9yPC9rZXk+CgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnRpbmdt YW5hZ2VyPC9zdHJpbmc+CgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1B cnJheTwva2V5PgoJCTxhcnJheT4KCQkJPGRpY3Q+CgkJCQk8a2V5PmNvbS5hcHBsZS5w cmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxTY2FsaW5nPC9rZXk+CgkJCQk8cmVhbD4x PC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNsaWVudDwva2V5 PgoJCQkJPHN0cmluZz5jb20uYXBwbGUucHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+CgkJ CQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQubW9kRGF0ZTwva2V5PgoJCQkJPGRh dGU+MjAwNC0xMi0wMlQwMDo1OTowOVo8L2RhdGU+CgkJCQk8a2V5PmNvbS5hcHBsZS5w cmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk+CgkJCQk8aW50ZWdlcj4wPC9pbnRlZ2Vy PgoJCQk8L2RpY3Q+CgkJPC9hcnJheT4KCTwvZGljdD4KCTxrZXk+Y29tLmFwcGxlLnBy aW50LnN1YlRpY2tldC5wYXBlcl9pbmZvX3RpY2tldDwva2V5PgoJPGRpY3Q+CgkJPGtl eT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTUFkanVzdGVkUGFnZVJlY3Q8L2tl eT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8 L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUucHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+ CgkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJ PGFycmF5PgoJCQkJPGRpY3Q+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZv cm1hdC5QTUFkanVzdGVkUGFnZVJlY3Q8L2tleT4KCQkJCQk8YXJyYXk+CgkJCQkJCTxy ZWFsPjAuMDwvcmVhbD4KCQkJCQkJPHJlYWw+MC4wPC9yZWFsPgoJCQkJCQk8cmVhbD43 OTI8L3JlYWw+CgkJCQkJCTxyZWFsPjYxMjwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJ CTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jbGllbnQ8L2tleT4KCQkJCQk8c3Ry aW5nPmNvbS5hcHBsZS5wcmludGluZ21hbmFnZXI8L3N0cmluZz4KCQkJCQk8a2V5PmNv bS5hcHBsZS5wcmludC50aWNrZXQubW9kRGF0ZTwva2V5PgoJCQkJCTxkYXRlPjIwMDQt MTItMDNUMTg6MTc6MjFaPC9kYXRlPgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRp Y2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJ PC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmlu dC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQk8ZGljdD4KCQkJ PGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmlu Zz5jb20uYXBwbGUucHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+CgkJCTxrZXk+Y29tLmFw cGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRp Y3Q+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTUFkanVzdGVk UGFwZXJSZWN0PC9rZXk+CgkJCQkJPGFycmF5PgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw+ CgkJCQkJCTxyZWFsPjAuMDwvcmVhbD4KCQkJCQkJPHJlYWw+NzkyPC9yZWFsPgoJCQkJ CQk8cmVhbD42MTI8L3JlYWw+CgkJCQkJPC9hcnJheT4KCQkJCQk8a2V5PmNvbS5hcHBs ZS5wcmludC50aWNrZXQuY2xpZW50PC9rZXk+CgkJCQkJPHN0cmluZz5jb20uYXBwbGUu cHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQu dGlja2V0Lm1vZERhdGU8L2tleT4KCQkJCQk8ZGF0ZT4yMDA0LTEyLTAzVDE4OjE3OjIx WjwvZGF0ZT4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFn PC9rZXk+CgkJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9h cnJheT4KCQk8L2RpY3Q+CgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBN Q29uc3RyYWluZWRQYXBlcjwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5w cmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPkNVUFNfQ1BMPC9zdHJp bmc+CgkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4K CQkJPGFycmF5PgoJCQkJPGRpY3Q+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFw ZXJJbmZvLlBNQ29uc3RyYWluZWRQYXBlcjwva2V5PgoJCQkJCTxmYWxzZS8+CgkJCQkJ PGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNsaWVudDwva2V5PgoJCQkJCTxzdHJp bmc+Q1VQU19DUEw8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNr ZXQubW9kRGF0ZTwva2V5PgoJCQkJCTxkYXRlPjIwMDQtMTItMDJUMDA6NTk6MDVaPC9k YXRlPgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tl eT4KCQkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5 PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1QYXBl ck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0 LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5DVVBTX0NQTDwvc3RyaW5nPgoJCQk8a2V5 PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk+CgkJCTxhcnJheT4K CQkJCTxkaWN0PgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVBh cGVyTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc+bmEtbGV0dGVyPC9zdHJpbmc+CgkJCQkJ PGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNsaWVudDwva2V5PgoJCQkJCTxzdHJp bmc+Q1VQU19DUEw8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNr ZXQubW9kRGF0ZTwva2V5PgoJCQkJCTxkYXRlPjIwMDQtMTItMDJUMDA6NTk6MDVaPC9k YXRlPgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tl eT4KCQkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5 PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1VbmFk anVzdGVkUGFnZVJlY3Q8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJp bnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5DVVBTX0NQTDwvc3RyaW5n PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk+CgkJ CTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhcGVy SW5mby5QTVVuYWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJ PHJlYWw+MC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw+CgkJCQkJCTxyZWFs Pjc5MjwvcmVhbD4KCQkJCQkJPHJlYWw+NjEyPC9yZWFsPgoJCQkJCTwvYXJyYXk+CgkJ CQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNsaWVudDwva2V5PgoJCQkJCTxz dHJpbmc+Y29tLmFwcGxlLnByaW50aW5nbWFuYWdlcjwvc3RyaW5nPgoJCQkJCTxrZXk+ Y29tLmFwcGxlLnByaW50LnRpY2tldC5tb2REYXRlPC9rZXk+CgkJCQkJPGRhdGU+MjAw NC0xMi0wMlQwMDo1OTowOVo8L2RhdGU+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQu dGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CgkJ CQk8L2RpY3Q+CgkJCTwvYXJyYXk+CgkJPC9kaWN0PgoJCTxrZXk+Y29tLmFwcGxlLnBy aW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQk8ZGljdD4K CQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0 cmluZz5DVVBTX0NQTDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNr ZXQuaXRlbUFycmF5PC9rZXk+CgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk+ Y29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYXBlclJlY3Q8L2tl eT4KCQkJCQk8YXJyYXk+CgkJCQkJCTxyZWFsPjAuMDwvcmVhbD4KCQkJCQkJPHJlYWw+ MC4wPC9yZWFsPgoJCQkJCQk8cmVhbD43OTI8L3JlYWw+CgkJCQkJCTxyZWFsPjYxMjwv cmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tl dC5jbGllbnQ8L2tleT4KCQkJCQk8c3RyaW5nPmNvbS5hcHBsZS5wcmludGluZ21hbmFn ZXI8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQubW9kRGF0 ZTwva2V5PgoJCQkJCTxkYXRlPjIwMDQtMTItMDJUMDA6NTk6MDlaPC9kYXRlPgoJCQkJ CTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8 aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGlj dD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8ucHBkLlBNUGFwZXJOYW1l PC9rZXk+CgkJPGRpY3Q+CgkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVh dG9yPC9rZXk+CgkJCTxzdHJpbmc+Q1VQU19DUEw8L3N0cmluZz4KCQkJPGtleT5jb20u YXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk+CgkJCQk8 ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8ucHBkLlBNUGFw ZXJOYW1lPC9rZXk+CgkJCQkJPHN0cmluZz5MZXR0ZXI8L3N0cmluZz4KCQkJCQk8a2V5 PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY2xpZW50PC9rZXk+CgkJCQkJPHN0cmluZz5D VVBTX0NQTDwvc3RyaW5nPgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5t b2REYXRlPC9rZXk+CgkJCQkJPGRhdGU+MjAwNC0xMi0wMlQwMDo1OTowNVo8L2RhdGU+ CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJ CQkJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CgkJCQk8L2RpY3Q+CgkJCTwvYXJyYXk+CgkJ PC9kaWN0PgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5BUElWZXJzaW9uPC9r ZXk+CgkJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJCTxrZXk+Y29tLmFwcGxlLnByaW50 LnRpY2tldC5wcml2YXRlTG9jazwva2V5PgoJCTxmYWxzZS8+CgkJPGtleT5jb20uYXBw bGUucHJpbnQudGlja2V0LnR5cGU8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5wcmlu dC5QYXBlckluZm9UaWNrZXQ8L3N0cmluZz4KCTwvZGljdD4KCTxrZXk+Y29tLmFwcGxl LnByaW50LnRpY2tldC5BUElWZXJzaW9uPC9rZXk+Cgk8c3RyaW5nPjAwLjIwPC9zdHJp bmc+Cgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQucHJpdmF0ZUxvY2s8L2tleT4K CTxmYWxzZS8+Cgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQudHlwZTwva2V5PgoJ PHN0cmluZz5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdFRpY2tldDwvc3RyaW5nPgo8 L2RpY3Q+CjwvcGxpc3Q+CoaShJmZD05TUHJpbnRBbGxQYWdlc4aSoJKEmZkLTlNQYXBl ck5hbWWGkoSZmQZMZXR0ZXKGkoSZmRVOU0hvcml6b25hbFBhZ2luYXRpb26GkoShm6KX AIaShJmZFk5TSG9yaXpvbnRhbGx5Q2VudGVyZWSGkqaShJmZCU5TUHJpbnRlcoaShISE CU5TUHJpbnRlcgCUkoSZmQlBZG9iZSBQREaGhpKEmZkITlNDb3BpZXOGkoShm6KXAYaS hJmZD05TU2NhbGluZ0ZhY3RvcoaShKGbhIQBZqEBhpKEmZkNTlNSaWdodE1hcmdpboaS hKGbuKEkhpKEmZkOTlNCb3R0b21NYXJnaW6GkoShm7ihJIaShJmZDE5TTGVmdE1hcmdp boaShKGbuKEkhpKEmZkLTlNUb3BNYXJnaW6GkoShm7ihJIaShJmZCk5TTGFzdFBhZ2WG koShm6KXgn////+GkoSZmQtOU0ZpcnN0UGFnZYaShKGbopcBhpKEmZkNTlNPcmllbnRh dGlvboaShKGbopcAhoaG </data> <key>RowAlign</key> <integer>0</integer> <key>RowSpacing</key> <real>36</real> <key>VPages</key> <integer>1</integer> <key>WindowInfo</key> <dict> <key>Frame</key> <string>{{164, 35}, {555, 797}}</string> <key>VisibleRegion</key> <string>{{0, 0}, {540, 704}}</string> <key>Zoom</key> <string>1</string> </dict> </dict> </plist> --- NEW FILE: edit_text_example.graffle --- <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CanvasColor</key> <dict> <key>a</key> <string>1</string> <key>w</key> <string>1</string> </dict> <key>ColumnAlign</key> <integer>0</integer> <key>ColumnSpacing</key> <real>36</real> <key>GraphDocumentVersion</key> <integer>2</integer> <key>GraphicsList</key> <array> [...1049 lines suppressed...] koShm6KXgn////+GkoSZmQtOU0ZpcnN0UGFnZYaShKGbopcBhpKEmZkNTlNPcmllbnRh dGlvboaShKGbopcAhoaG </data> <key>RowAlign</key> <integer>0</integer> <key>RowSpacing</key> <real>36</real> <key>VPages</key> <integer>1</integer> <key>WindowInfo</key> <dict> <key>Frame</key> <string>{{23, 98}, {906, 548}}</string> <key>VisibleRegion</key> <string>{{8, 0}, {891, 455}}</string> <key>Zoom</key> <string>1</string> </dict> </dict> </plist> --- NEW FILE: parameter_flow.graffle --- <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CanvasColor</key> <dict> <key>a</key> <string>1</string> <key>w</key> <string>1</string> </dict> <key>ColumnAlign</key> <integer>0</integer> <key>ColumnSpacing</key> <real>36</real> <key>GraphDocumentVersion</key> <integer>2</integer> <key>GraphicsList</key> <array> <dict> <key>Class</key> <string>LineGraphic</string> <key>Head</key> <dict> <key>ID</key> <integer>3</integer> <key>Info</key> <integer>4</integer> </dict> <key>ID</key> <integer>14</integer> <key>Points</key> <array> <string>{215.999, 175.25}</string> <string>{261, 175.25}</string> </array> <key>Style</key> <dict> <key>stroke</key> <dict> <key>HeadArrow</key> <string>FilledArrow</string> <key>LineType</key> <integer>1</integer> <key>TailArrow</key> <string>0</string> </dict> </dict> <key>Tail</key> <dict> <key>ID</key> <integer>2</integer> <key>Info</key> <integer>3</integer> </dict> </dict> <dict> <key>Class</key> <string>LineGraphic</string> <key>Head</key> <dict> <key>ID</key> <integer>4</integer> <key>Info</key> <integer>2</integer> </dict> <key>ID</key> <integer>13</integer> <key>Points</key> <array> <string>{312.492, 198}</string> <string>{351, 216}</string> </array> <key>Style</key> <dict> <key>stroke</key> <dict> <key>HeadArrow</key> <string>FilledArrow</string> <key>LineType</key> <integer>1</integer> <key>TailArrow</key> <string>0</string> </dict> </dict> <key>Tail</key> <dict> <key>ID</key> <integer>3</integer> <key>Info</key> <integer>1</integer> </dict> </dict> <dict> <key>Class</key> <string>LineGraphic</string> <key>Head</key> <dict> <key>ID</key> <integer>3</integer> <key>Info</key> <integer>5</integer> </dict> <key>ID</key> <integer>12</integer> <key>Points</key> <array> <string>{247, 216}</string> <string>{282.205, 198}</string> </array> <key>Style</key> <dict> <key>stroke</key> <dict> <key>HeadArrow</key> <string>FilledArrow</string> <key>LineType</key> <integer>1</integer> <key>TailArrow</key> <string>0</string> </dict> </dict> <key>Tail</key> <dict> <key>ID</key> <integer>1</integer> <key>Info</key> <integer>2</integer> </dict> </dict> <dict> <key>Class</key> <string>LineGraphic</string> <key>Head</key> <dict> <key>ID</key> <integer>1</integer> <key>Info</key> <integer>3</integer> </dict> <key>ID</key> <integer>11</integer> <key>Points</key> <array> <string>{315, 243}</string> <string>{279, 243}</string> </array> <key>Style</key> <dict> <key>stroke</key> <dict> <key>HeadArrow</key> <string>FilledArrow</string> <key>LineType</key> <integer>1</integer> <key>TailArrow</key> <string>0</string> </dict> </dict> <key>Tail</key> <dict> <key>ID</key> <integer>4</integer> <key>Info</key> <integer>4</integer> </dict> </dict> <dict> <key>Class</key> <string>LineGraphic</string> <key>Head</key> <dict> <key>ID</key> <integer>5</integer> <key>Info</key> <integer>2</integer> </dict> <key>ID</key> <integer>10</integer> <key>Points</key> <array> <string>{351, 270}</string> <string>{297, 297}</string> </array> <key>Style</key> <dict> <key>stroke</key> <dict> <key>HeadArrow</key> <string>FilledArrow</string> <key>LineType</key> <integer>1</integer> <key>TailArrow</key> <string>0</string> </dict> </dict> <key>Tail</key> <dict> <key>ID</key> <integer>4</integer> <key>Info</key> <integer>1</integer> </dict> </dict> <dict> <key>Class</key> <string>LineGraphic</string> <key>Head</key> <dict> <key>ID</key> <integer>2</integer> <key>Info</key> <integer>1</integer> </dict> <key>ID</key> <integer>9</integer> <key>Points</key> <array> <string>{297, 351}</string> <string>{243, 360}</string> <string>{171, 198}</string> </array> <key>Style</key> <dict> <key>stroke</key> <dict> <key>HeadArrow</key> <string>FilledArrow</string> <key>LineType</key> <integer>1</integer> <key>TailArrow</key> <string>0</string> </dict> </dict> <key>Tail</key> <dict> <key>ID</key> <integer>5</integer> <key>Info</key> <integer>1</integer> </dict> </dict> <dict> <key>Class</key> <string>LineGraphic</string> <key>Head</key> <dict> <key>ID</key> <integer>3</integer> <key>Info</key> <integer>4</integer> </dict> <key>ID</key> <integer>8</integer> <key>Points</key> <array> <string>{270, 414}</string> <string>{198, 387}</string> <string>{117, 171}</string> <string>{189, 144}</string> <string>{261, 175.25}</string> </array> <key>Style</key> <dict> <key>stroke</key> <dict> <key>HeadArrow</key> <string>FilledArrow</string> <key>LineType</key> <integer>1</integer> <key>TailArrow</key> <string>0</string> </dict> </dict> <key>Tail</key> <dict> <key>ID</key> <integer>6</integer> </dict> </dict> <dict> <key>Class</key> <string>LineGraphic</string> <key>Head</key> <dict> <key>ID</key> <integer>6</integer> <key>Info</key> <integer>2</integer> </dict> <key>ID</key> <integer>7</integer> <key>Points</key> <array> <string>{297, 351}</string> <string>{297, 387}</string> </array> <key>Style</key> <dict> <key>stroke</key> <dict> <key>HeadArrow</key> <string>FilledArrow</string> <key>LineType</key> <integer>1</integer> <key>TailArrow</key> <string>0</string> </dict> </dict> <key>Tail</key> <dict> <key>ID</key> <integer>5</integer> </dict> </dict> <dict> <key>Bounds</key> <string>{{270, 387}, {54, 54}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>ID</key> <integer>6</integer> <key>Magnets</key> <array> <string>{0, 1}</string> <string>{0, -1}</string> <string>{1, 0}</string> <string>{-1, 0}</string> </array> <key>Shape</key> <string>Circle</string> <key>Text</key> <dict> <key>Text</key> <string>{\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc \f0\fs20 \cf0 Script}</string> </dict> </dict> <dict> <key>Bounds</key> <string>{{252, 297}, {90, 54}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>ID</key> <integer>5</integer> <key>Magnets</key> <array> <string>{0, 1}</string> <string>{0, -1}</string> <string>{1, 0}</string> <string>{-1, 0}</string> </array> <key>Shape</key> <string>Diamond</string> <key>Text</key> <dict> <key>Text</key> <string>{\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc \f0\fs20 \cf0 Completed?}</string> </dict> </dict> <dict> <key>Bounds</key> <string>{{315, 216}, {72, 54}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>ID</key> <integer>4</integer> <key>Magnets</key> <array> <string>{0, 1}</string> <string>{0, -1}</string> <string>{1, 0}</string> <string>{-1, 0}</string> </array> <key>Shape</key> <string>Rectangle</string> <key>Text</key> <dict> <key>Text</key> <string>{\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc \f0\fs20 \cf0 Process Command}</string> </dict> </dict> <dict> <key>Bounds</key> <string>{{261, 153}, {72, 45}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>ID</key> <integer>3</integer> <key>Magnets</key> <array> <string>{0.305555, 0.68537}</string> <string>{0, -1}</string> <string>{1, 0}</string> <string>{-1, 0}</string> <string>{-0.330494, 0.81463}</string> </array> <key>Shape</key> <string>Rectangle</string> <key>Style</key> <dict> <key>fill</key> <dict> <key>Color</key> <dict> <key>a</key> <string>1</string> <key>b</key> <string>0.752941</string> <key>g</key> <string>0.752941</string> <key>r</key> <string>0.752941</string> </dict> </dict> </dict> <key>Text</key> <dict> <key>Text</key> <string>{\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc \f0\fs20 \cf0 Command Parameter Handling}</string> </dict> </dict> <dict> <key>Bounds</key> <string>{{126, 153}, {90, 45}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>ID</key> <integer>2</integer> <key>Magnets</key> <array> <string>{0, 1}</string> <string>{0, -1}</string> <string>{1, 0}</string> <string>{-1, 0}</string> </array> <key>Shape</key> <string>RoundRect</string> <key>Text</key> <dict> <key>Text</key> <string>{\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc \f0\fs20 \cf0 Default / Preferences}</string> </dict> </dict> <dict> <key>Bounds</key> <string>{{215, 216}, {64, 54}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>ID</key> <integer>1</integer> <key>Magnets</key> <array> <string>{0, 1}</string> <string>{0, -1}</string> <string>{1, 0}</string> <string>{-1, 0}</string> </array> <key>Shape</key> <string>DocumentShape</string> <key>Text</key> <dict> <key>Text</key> <string>{\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc \f0\fs20 \cf0 Document Model}</string> </dict> </dict> </array> <key>GridInfo</key> <dict/> <key>HPages</key> <integer>1</integer> <key>ImageCounter</key> <integer>1</integer> <key>IsPalette</key> <string>NO</string> <key>Layers</key> <array> <dict> <key>Lock</key> <string>NO</string> <key>Name</key> <string>Layer 1</string> <key>Print</key> <string>YES</string> <key>View</key> <string>YES</string> </dict> </array> <key>LayoutInfo</key> <dict> <key>AutoAdjust</key> <string>YES</string> <key>MagneticFieldCenter</key> <string>{0, 0}</string> </dict> <key>MagnetsEnabled</key> <string>YES</string> <key>PageBreakColor</key> <dict> <key>a</key> <string>1</string> <key>w</key> <string>0.666667</string> </dict> <key>PageBreaks</key> <string>YES</string> <key>PageSetup</key> <data> BAt0eXBlZHN0cmVhbYED6IQBQISEhAtOU1ByaW50SW5mbwGEhAhOU09iamVjdACFkoSE hBNOU011dGFibGVEaWN0aW9uYXJ5AISEDE5TRGljdGlvbmFyeQCUhAFpFJKEhIQITlNT dHJpbmcBlIQBKxBOU0pvYkRpc3Bvc2l0aW9uhpKEmZkPTlNQcmludFNwb29sSm9ihpKE mZkLTlNQYXBlclNpemWGkoSEhAdOU1ZhbHVlAJSEASqEhAx7X05TU2l6ZT1mZn2cgQJk gQMYhpKEmZkZTlNQcmludFJldmVyc2VPcmllbnRhdGlvboaShISECE5TTnVtYmVyAJ2b hJeXAIaShJmZFE5TVmVydGljYWxQYWdpbmF0aW9uhpKEoZuilwCGkoSZmRROU1ZlcnRp Y2FsbHlDZW50ZXJlZIaShKGbopcBhpKEmZkOTlNQTVBhZ2VGb3JtYXSGkoSEhAZOU0Rh dGEAlJeBIaqEB1s4NjE4Y108P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYt OCI/Pgo8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZSBDb21wdXRlci8vRFRE IFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5 TGlzdC0xLjAuZHRkIj4KPHBsaXN0IHZlcnNpb249IjEuMCI+CjxkaWN0PgoJPGtleT5j b20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5Gb3JtYXR0aW5nUHJpbnRlcjwva2V5PgoJ PGRpY3Q+CgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4K CQk8c3RyaW5nPmNvbS5hcHBsZS5wcmludGluZ21hbmFnZXI8L3N0cmluZz4KCQk8a2V5 PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk+CgkJPGFycmF5PgoJ CQk8ZGljdD4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuRm9ybWF0 dGluZ1ByaW50ZXI8L2tleT4KCQkJCTxzdHJpbmc+QWRvYmVQREY8L3N0cmluZz4KCQkJ CTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jbGllbnQ8L2tleT4KCQkJCTxzdHJp bmc+Y29tLmFwcGxlLnByaW50aW5nbWFuYWdlcjwvc3RyaW5nPgoJCQkJPGtleT5jb20u YXBwbGUucHJpbnQudGlja2V0Lm1vZERhdGU8L2tleT4KCQkJCTxkYXRlPjIwMDQtMTIt MDJUMDA6NTk6MDlaPC9kYXRlPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0 LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KCQkJPC9kaWN0 PgoJCTwvYXJyYXk+Cgk8L2RpY3Q+Cgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9y bWF0LlBNSG9yaXpvbnRhbFJlczwva2V5PgoJPGRpY3Q+CgkJPGtleT5jb20uYXBwbGUu cHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5wcmlu dGluZ21hbmFnZXI8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQu aXRlbUFycmF5PC9rZXk+CgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk+Y29tLmFw cGxlLnByaW50LlBhZ2VGb3JtYXQuUE1Ib3Jpem9udGFsUmVzPC9rZXk+CgkJCQk8cmVh bD43MjwvcmVhbD4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jbGllbnQ8 L2tleT4KCQkJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50aW5nbWFuYWdlcjwvc3RyaW5n PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lm1vZERhdGU8L2tleT4KCQkJ CTxkYXRlPjIwMDQtMTItMDJUMDA6NTk6MDlaPC9kYXRlPgoJCQkJPGtleT5jb20uYXBw bGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI+MDwvaW50 ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk+Cgk8L2RpY3Q+Cgk8a2V5PmNvbS5hcHBs ZS5wcmludC5QYWdlRm9ybWF0LlBNT3JpZW50YXRpb248L2tleT4KCTxkaWN0PgoJCTxr ZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk+CgkJPHN0cmluZz5j b20uYXBwbGUucHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+CgkJPGtleT5jb20uYXBwbGUu cHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4KCQkJPGRpY3Q+CgkJ CQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNT3JpZW50YXRpb248L2tl eT4KCQkJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CgkJCQk8a2V5PmNvbS5hcHBsZS5wcmlu dC50aWNrZXQuY2xpZW50PC9rZXk+CgkJCQk8c3RyaW5nPmNvbS5hcHBsZS5wcmludGlu Z21hbmFnZXI8L3N0cmluZz4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5t b2REYXRlPC9rZXk+CgkJCQk8ZGF0ZT4yMDA0LTEyLTAyVDAwOjU5OjA5WjwvZGF0ZT4K CQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJ CTxpbnRlZ2VyPjA8L2ludGVnZXI+CgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0 PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVNjYWxpbmc8L2tleT4K CTxkaWN0PgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk+ CgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+CgkJPGtl eT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4K CQkJPGRpY3Q+CgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNU2Nh bGluZzwva2V5PgoJCQkJPHJlYWw+MTwvcmVhbD4KCQkJCTxrZXk+Y29tLmFwcGxlLnBy aW50LnRpY2tldC5jbGllbnQ8L2tleT4KCQkJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50 aW5nbWFuYWdlcjwvc3RyaW5nPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0 Lm1vZERhdGU8L2tleT4KCQkJCTxkYXRlPjIwMDQtMTItMDJUMDA6NTk6MDlaPC9kYXRl PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJ CQkJPGludGVnZXI+MDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk+Cgk8L2Rp Y3Q+Cgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8 L2tleT4KCTxkaWN0PgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9y PC9rZXk+CgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+ CgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxh cnJheT4KCQkJPGRpY3Q+CgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0 LlBNVmVydGljYWxSZXM8L2tleT4KCQkJCTxyZWFsPjcyPC9yZWFsPgoJCQkJPGtleT5j b20uYXBwbGUucHJpbnQudGlja2V0LmNsaWVudDwva2V5PgoJCQkJPHN0cmluZz5jb20u YXBwbGUucHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+CgkJCQk8a2V5PmNvbS5hcHBsZS5w cmludC50aWNrZXQubW9kRGF0ZTwva2V5PgoJCQkJPGRhdGU+MjAwNC0xMi0wMlQwMDo1 OTowOVo8L2RhdGU+CgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVG bGFnPC9rZXk+CgkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQk8L2RpY3Q+CgkJPC9h cnJheT4KCTwvZGljdD4KCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1W ZXJ0aWNhbFNjYWxpbmc8L2tleT4KCTxkaWN0PgoJCTxrZXk+Y29tLmFwcGxlLnByaW50 LnRpY2tldC5jcmVhdG9yPC9rZXk+CgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnRpbmdt YW5hZ2VyPC9zdHJpbmc+CgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1B cnJheTwva2V5PgoJCTxhcnJheT4KCQkJPGRpY3Q+CgkJCQk8a2V5PmNvbS5hcHBsZS5w cmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxTY2FsaW5nPC9rZXk+CgkJCQk8cmVhbD4x PC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNsaWVudDwva2V5 PgoJCQkJPHN0cmluZz5jb20uYXBwbGUucHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+CgkJ CQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQubW9kRGF0ZTwva2V5PgoJCQkJPGRh dGU+MjAwNC0xMi0wMlQwMDo1OTowOVo8L2RhdGU+CgkJCQk8a2V5PmNvbS5hcHBsZS5w cmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk+CgkJCQk8aW50ZWdlcj4wPC9pbnRlZ2Vy PgoJCQk8L2RpY3Q+CgkJPC9hcnJheT4KCTwvZGljdD4KCTxrZXk+Y29tLmFwcGxlLnBy aW50LnN1YlRpY2tldC5wYXBlcl9pbmZvX3RpY2tldDwva2V5PgoJPGRpY3Q+CgkJPGtl eT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTUFkanVzdGVkUGFnZVJlY3Q8L2tl eT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8 L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUucHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+ CgkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJ PGFycmF5PgoJCQkJPGRpY3Q+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZv cm1hdC5QTUFkanVzdGVkUGFnZVJlY3Q8L2tleT4KCQkJCQk8YXJyYXk+CgkJCQkJCTxy ZWFsPjAuMDwvcmVhbD4KCQkJCQkJPHJlYWw+MC4wPC9yZWFsPgoJCQkJCQk8cmVhbD43 OTI8L3JlYWw+CgkJCQkJCTxyZWFsPjYxMjwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJ CTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jbGllbnQ8L2tleT4KCQkJCQk8c3Ry aW5nPmNvbS5hcHBsZS5wcmludGluZ21hbmFnZXI8L3N0cmluZz4KCQkJCQk8a2V5PmNv bS5hcHBsZS5wcmludC50aWNrZXQubW9kRGF0ZTwva2V5PgoJCQkJCTxkYXRlPjIwMDQt MTItMDNUMTg6MDU6NDdaPC9kYXRlPgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRp Y2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJ PC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmlu dC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQk8ZGljdD4KCQkJ PGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmlu Zz5jb20uYXBwbGUucHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+CgkJCTxrZXk+Y29tLmFw cGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRp Y3Q+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTUFkanVzdGVk UGFwZXJSZWN0PC9rZXk+CgkJCQkJPGFycmF5PgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw+ CgkJCQkJCTxyZWFsPjAuMDwvcmVhbD4KCQkJCQkJPHJlYWw+NzkyPC9yZWFsPgoJCQkJ CQk8cmVhbD42MTI8L3JlYWw+CgkJCQkJPC9hcnJheT4KCQkJCQk8a2V5PmNvbS5hcHBs ZS5wcmludC50aWNrZXQuY2xpZW50PC9rZXk+CgkJCQkJPHN0cmluZz5jb20uYXBwbGUu cHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQu dGlja2V0Lm1vZERhdGU8L2tleT4KCQkJCQk8ZGF0ZT4yMDA0LTEyLTAzVDE4OjA1OjQ3 WjwvZGF0ZT4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFn PC9rZXk+CgkJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9h cnJheT4KCQk8L2RpY3Q+CgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBN Q29uc3RyYWluZWRQYXBlcjwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5w cmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPkNVUFNfQ1BMPC9zdHJp bmc+CgkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4K CQkJPGFycmF5PgoJCQkJPGRpY3Q+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFw ZXJJbmZvLlBNQ29uc3RyYWluZWRQYXBlcjwva2V5PgoJCQkJCTxmYWxzZS8+CgkJCQkJ PGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNsaWVudDwva2V5PgoJCQkJCTxzdHJp bmc+Q1VQU19DUEw8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNr ZXQubW9kRGF0ZTwva2V5PgoJCQkJCTxkYXRlPjIwMDQtMTItMDJUMDA6NTk6MDVaPC9k YXRlPgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tl eT4KCQkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5 PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1QYXBl ck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0 LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5DVVBTX0NQTDwvc3RyaW5nPgoJCQk8a2V5 PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk+CgkJCTxhcnJheT4K CQkJCTxkaWN0PgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVBh cGVyTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc+bmEtbGV0dGVyPC9zdHJpbmc+CgkJCQkJ PGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNsaWVudDwva2V5PgoJCQkJCTxzdHJp bmc+Q1VQU19DUEw8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNr ZXQubW9kRGF0ZTwva2V5PgoJCQkJCTxkYXRlPjIwMDQtMTItMDJUMDA6NTk6MDVaPC9k YXRlPgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tl eT4KCQkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5 PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1VbmFk anVzdGVkUGFnZVJlY3Q8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJp bnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5DVVBTX0NQTDwvc3RyaW5n PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk+CgkJ CTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhcGVy SW5mby5QTVVuYWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJ PHJlYWw+MC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw+CgkJCQkJCTxyZWFs Pjc5MjwvcmVhbD4KCQkJCQkJPHJlYWw+NjEyPC9yZWFsPgoJCQkJCTwvYXJyYXk+CgkJ CQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNsaWVudDwva2V5PgoJCQkJCTxz dHJpbmc+Y29tLmFwcGxlLnByaW50aW5nbWFuYWdlcjwvc3RyaW5nPgoJCQkJCTxrZXk+ Y29tLmFwcGxlLnByaW50LnRpY2tldC5tb2REYXRlPC9rZXk+CgkJCQkJPGRhdGU+MjAw NC0xMi0wMlQwMDo1OTowOVo8L2RhdGU+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQu dGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CgkJ CQk8L2RpY3Q+CgkJCTwvYXJyYXk+CgkJPC9kaWN0PgoJCTxrZXk+Y29tLmFwcGxlLnBy aW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQk8ZGljdD4K CQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0 cmluZz5DVVBTX0NQTDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNr ZXQuaXRlbUFycmF5PC9rZXk+CgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk+ Y29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYXBlclJlY3Q8L2tl eT4KCQkJCQk8YXJyYXk+CgkJCQkJCTxyZWFsPjAuMDwvcmVhbD4KCQkJCQkJPHJlYWw+ MC4wPC9yZWFsPgoJCQkJCQk8cmVhbD43OTI8L3JlYWw+CgkJCQkJCTxyZWFsPjYxMjwv cmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tl dC5jbGllbnQ8L2tleT4KCQkJCQk8c3RyaW5nPmNvbS5hcHBsZS5wcmludGluZ21hbmFn ZXI8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQubW9kRGF0 ZTwva2V5PgoJCQkJCTxkYXRlPjIwMDQtMTItMDJUMDA6NTk6MDlaPC9kYXRlPgoJCQkJ CTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8 aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGlj dD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8ucHBkLlBNUGFwZXJOYW1l PC9rZXk+CgkJPGRpY3Q+CgkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVh dG9yPC9rZXk+CgkJCTxzdHJpbmc+Q1VQU19DUEw8L3N0cmluZz4KCQkJPGtleT5jb20u YXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk+CgkJCQk8 ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8ucHBkLlBNUGFw ZXJOYW1lPC9rZXk+CgkJCQkJPHN0cmluZz5MZXR0ZXI8L3N0cmluZz4KCQkJCQk8a2V5 PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY2xpZW50PC9rZXk+CgkJCQkJPHN0cmluZz5D VVBTX0NQTDwvc3RyaW5nPgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5t b2REYXRlPC9rZXk+CgkJCQkJPGRhdGU+MjAwNC0xMi0wMlQwMDo1OTowNVo8L2RhdGU+ CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJ CQkJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CgkJCQk8L2RpY3Q+CgkJCTwvYXJyYXk+CgkJ PC9kaWN0PgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5BUElWZXJzaW9uPC9r ZXk+CgkJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJCTxrZXk+Y29tLmFwcGxlLnByaW50 LnRpY2tldC5wcml2YXRlTG9jazwva2V5PgoJCTxmYWxzZS8+CgkJPGtleT5jb20uYXBw bGUucHJpbnQudGlja2V0LnR5cGU8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5wcmlu dC5QYXBlckluZm9UaWNrZXQ8L3N0cmluZz4KCTwvZGljdD4KCTxrZXk+Y29tLmFwcGxl LnByaW50LnRpY2tldC5BUElWZXJzaW9uPC9rZXk+Cgk8c3RyaW5nPjAwLjIwPC9zdHJp bmc+Cgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQucHJpdmF0ZUxvY2s8L2tleT4K CTxmYWxzZS8+Cgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQudHlwZTwva2V5PgoJ PHN0cmluZz5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdFRpY2tldDwvc3RyaW5nPgo8 L2RpY3Q+CjwvcGxpc3Q+CoaShJmZD05TUHJpbnRBbGxQYWdlc4aSoJKEmZkLTlNQYXBl ck5hbWWGkoSZmQZMZXR0ZXKGkoSZmRVOU0hvcml6b25hbFBhZ2luYXRpb26GkoShm6KX AIaShJmZFk5TSG9yaXpvbnRhbGx5Q2VudGVyZWSGkqaShJmZCU5TUHJpbnRlcoaShISE CU5TUHJpbnRlcgCUkoSZmQlBZG9iZSBQREaGhpKEmZkITlNDb3BpZXOGkoShm6KXAYaS hJmZD05TU2NhbGluZ0ZhY3RvcoaShKGbhIQBZqEBhpKEmZkNTlNSaWdodE1hcmdpboaS hKGbuKEkhpKEmZkOTlNCb3R0b21NYXJnaW6GkoShm7ihJIaShJmZDE5TTGVmdE1hcmdp boaShKGbuKEkhpKEmZkLTlNUb3BNYXJnaW6GkoShm7ihJIaShJmZCk5TTGFzdFBhZ2WG koShm6KXgn////+GkoSZmQtOU0ZpcnN0UGFnZYaShKGbopcBhpKEmZkNTlNPcmllbnRh dGlvboaShKGbopcAhoaG </data> <key>RowAlign</key> <integer>0</integer> <key>RowSpacing</key> <real>36</real> <key>VPages</key> <integer>1</integer> <key>WindowInfo</key> <dict> <key>Frame</key> <string>{{63, 12}, {555, 797}}</string> <key>VisibleRegion</key> <string>{{0, 0}, {540, 704}}</string> <key>Zoom</key> <string>1</string> </dict> </dict> </plist> --- NEW FILE: codebase.graffle --- <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CanvasColor</key> <dict> <key>a</key> <string>1</string> <key>w</key> <string>1</string> </dict> <key>ColumnAlign</key> <integer>0</integer> <key>ColumnSpacing</key> <real>36</real> <key>GraphDocumentVersion</key> <integer>2</integer> <key>GraphicsList</key> <array> [...1564 lines suppressed...] koShm6KXgn////+GkoSZmQtOU0ZpcnN0UGFnZYaShKGbopcBhpKEmZkNTlNPcmllbnRh dGlvboaShKGbopcBhoaG </data> <key>RowAlign</key> <integer>0</integer> <key>RowSpacing</key> <real>36</real> <key>VPages</key> <integer>1</integer> <key>WindowInfo</key> <dict> <key>Frame</key> <string>{{167, 0}, {677, 832}}</string> <key>VisibleRegion</key> <string>{{0, -99}, {662, 739}}</string> <key>Zoom</key> <string>1</string> </dict> </dict> </plist> --- NEW FILE: adam_and_eve.graffle --- <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CanvasColor</key> <dict> <key>a</key> <string>1</string> <key>w</key> <string>1</string> </dict> <key>ColumnAlign</key> <integer>0</integer> <key>ColumnSpacing</key> <real>36</real> <key>GraphDocumentVersion</key> <integer>2</integer> <key>GraphicsList</key> <array> <dict> <key>Class</key> <string>LineGraphic</string> <key>Head</key> <dict> <key>ID</key> <integer>37</integer> <key>Info</key> <integer>2</integer> </dict> <key>ID</key> <integer>45</integer> <key>Points</key> <array> <string>{378, 310.25}</string> <string>{441, 387}</string> </array> <key>Style</key> <dict> <key>stroke</key> <dict> <key>HeadArrow</key> <string>FilledArrow</string> <key>LineType</key> <integer>1</integer> <key>TailArrow</key> <string>FilledArrow</string> </dict> </dict> <key>Tail</key> <dict> <key>ID</key> <integer>34</integer> <key>Info</key> <integer>3</integer> </dict> </dict> <dict> <key>Class</key> <string>LineGraphic</string> <key>Head</key> <dict> <key>ID</key> <integer>36</integer> <key>Info</key> <integer>2</integer> </dict> <key>ID</key> <integer>44</integer> <key>Points</key> <array> <string>{198, 310.25}</string> <string>{135, 387}</string> </array> <key>Style</key> <dict> <key>stroke</key> <dict> <key>HeadArrow</key> <string>FilledArrow</string> <key>LineType</key> <integer>1</integer> <key>TailArrow</key> <string>FilledArrow</string> </dict> </dict> <key>Tail</key> <dict> <key>ID</key> <integer>33</integer> <key>Info</key> <integer>4</integer> </dict> </dict> <dict> <key>Class</key> <string>LineGraphic</string> <key>Head</key> <dict> <key>ID</key> <integer>33</integer> <key>Info</key> <integer>4</integer> </dict> <key>ID</key> <integer>43</integer> <key>Points</key> <array> <string>{144, 315}</string> <string>{198, 310.25}</string> </array> <key>Style</key> <dict> <key>stroke</key> <dict> <key>HeadArrow</key> <string>FilledArrow</string> <key>LineType</key> <integer>1</integer> <key>TailArrow</key> <string>FilledArrow</string> </dict> </dict> <key>Tail</key> <dict> <key>ID</key> <integer>31</integer> <key>Info</key> <integer>3</integer> </dict> </dict> <dict> <key>Class</key> <string>LineGraphic</string> <key>Head</key> <dict> <key>ID</key> <integer>34</integer> <key>Info</key> <integer>3</integer> </dict> <key>ID</key> <integer>42</integer> <key>Points</key> <array> <string>{432, 315}</string> <string>{378, 310.25}</string> </array> <key>Style</key> <dict> <key>stroke</key> <dict> <key>HeadArrow</key> <string>FilledArrow</string> <key>LineType</key> <integer>1</integer> <key>TailArrow</key> <string>FilledArrow</string> </dict> </dict> <key>Tail</key> <dict> <key>ID</key> <integer>32</integer> <key>Info</key> <integer>4</integer> </dict> </dict> <dict> <key>Class</key> <string>LineGraphic</string> <key>Head</key> <dict> <key>ID</key> <integer>32</integer> <key>Info</key> <integer>2</integer> </dict> <key>ID</key> <integer>41</integer> <key>Points</key> <array> <string>{378, 148.25}</string> <string>{432, 162}</string> <string>{459, 288}</string> </array> <key>Style</key> <dict> <key>stroke</key> <dict> <key>HeadArrow</key> <string>FilledArrow</string> <key>LineType</key> <integer>1</integer> <key>TailArrow</key> <string>0</string> </dict> </dict> <key>Tail</key> <dict> <key>ID</key> <integer>28</integer> <key>Info</key> <integer>3</integer> </dict> </dict> <dict> <key>Class</key> <string>LineGraphic</string> <key>Head</key> <dict> <key>ID</key> <integer>31</integer> <key>Info</key> <integer>2</integer> </dict> <key>ID</key> <integer>40</integer> <key>Points</key> <array> <string>{198, 148.25}</string> <string>{144, 162}</string> <string>{117, 288}</string> </array> <key>Style</key> <dict> <key>stroke</key> <dict> <key>HeadArrow</key> <string>FilledArrow</string> <key>LineType</key> <integer>1</integer> <key>TailArrow</key> <string>0</string> </dict> </dict> <key>Tail<... [truncated message content] |
|
From: Foster B. <fos...@us...> - 2005-04-18 21:15:56
|
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/documentation/sources/doxygen_support_files/images In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/documentation/sources/doxygen_support_files/images Added Files: stlab.jpg Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: stlab.jpg --- (This appears to be a binary file; contents omitted.) |
|
From: Foster B. <fos...@us...> - 2005-04-18 21:15:56
|
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/documentation/sources In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/documentation/sources Added Files: documentation.doxygen Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: documentation.doxygen --- # Doxyfile 1.4.0 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. [...1289 lines suppressed...] # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO |
|
From: Foster B. <fos...@us...> - 2005-04-18 21:15:56
|
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/documentation/sources/tutorials/images In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/documentation/sources/tutorials/images Added Files: forest_deletion.jpg forest_empty.jpg forest_insertion.jpg forest_simple.jpg Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: forest_deletion.jpg --- (This appears to be a binary file; contents omitted.) --- NEW FILE: forest_insertion.jpg --- (This appears to be a binary file; contents omitted.) --- NEW FILE: forest_empty.jpg --- (This appears to be a binary file; contents omitted.) --- NEW FILE: forest_simple.jpg --- (This appears to be a binary file; contents omitted.) |
|
From: Foster B. <fos...@us...> - 2005-04-18 21:15:55
|
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/documentation/sources/structure In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/documentation/sources/structure Added Files: asl_home.dox contributing.dox cvs_howto.dox mainpage.dox preface.dox Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: cvs_howto.dox --- /*! \page asl_download_cvs Obtaining ASL With CVS CVS (Concurrent Versions System) access to the ASL sources is available through SourceForge.net. Most modern operating systems have a freely available implementation of CVS; some of them even have it pre-installed. For more information on CVS binaries as well as using CVS see <a href="http://sourceforge.net/docman/display_doc.php?docid=14033&group_id=1" target="_new">SourceForge.net's documentation</a>. The general steps for command-line access to ASL with CVS consists of the following (Note there is no password for the anonymous account; just hit <code><return></code> when prompted): \verbatim joeuser% cd /local/cvsroot/directory joeuser% cvs -d:pserver:ano...@cv...:/cvsroot/adobe-source login joeuser% cvs -z3 -d:pserver:ano...@cv...:/cvsroot/adobe-source checkout adobe-source joeuser% cvs -d:pserver:ano...@cv...:/cvsroot/adobe-source logout \endverbatim This will cause a directory called <code>adobe-source</code> to appear in your local CVS root directory. All the ASL sources will be within it. Note that you will also have to download the Boost library and make any/all appropriate patches (see the ASL read me file for more information). Note that this is read-only access. If you wish to obtain write access to the repository please contact one of the project administrators on the <a href="http://sourceforge.net/projects/adobe-source/" target="_new">SourceForge project page</a>. */ --- NEW FILE: contributing.dox --- /*! \page asl_contributing Contributing to ASL We are very excited to allow other developers the opportunity to work on the Adobe Source Libraries with us. Here we will discuss the general guidelines we will use to manage the development and release of the Adobe Source Libraries. \section asl_contrib_license_guidelines License Guidelines All code contributions must be under the MIT license and copyright of the Adobe opensource project. By contributing code you agree that we can distribute the contribution under the terms of the MIT license, that it can be distributed without any royalties, copyright, trademark, patent or other legal lock ups. Open source means no discrimination against any group or individual that may wish to use the code. \section asl_contrib_submit_guidelines Submission Guidelines The fundamental philosophy by which we will manage development and contributions to the ASL is by a mainline/sandbox method. \subsection asl_contrib_submit_mainline The Mainline <code>./adobe-source</code> is the mainline trunk and is the latest official state of the Adobe Source Libraries. Currently Sean Parent and Foster Brereton will manage all the code changes that are made into this trunk. \subsection asl_contrib_submit_sandbox The Sandbox <code>./sandbox</code> is a sibling directory to <code>./adobe-source</code> and is the main location for hacking. The main sandbox branch will be in <code>./sandbox/adobe-source</code>. Developers are encouraged to collaborate with other developers on code, but branching of the sandboxes is also acceptable. Sub-branches should reside in the sandbox folder. \subsection asl_contrib_submit_review The Review Process In order to have code merged from a sandbox to the mainline, the code must undergo a formal review process. Basically all this means is that you notify Sean or Foster of a change you would like to have propagated to the mainline trunk. They will examine your changes, review them, and provide necessary changes or comments. If the suggestion is ultimately accepted, they will merge the change back to the mainline branch. \section asl_contrib_coding_guidelines When in Rome... Please try to keep the format of the code in line with the rest of the project. Code formatting is a highly-debated issue between programmers (even internally Adobe has many seasoned developers with widely differing formatting styles). We request code submissions to have as close to the same format as what is already present in the code base. Granted there are inconsistencies in the code base already- we are trying to keep it to a minimum going forward. \section asl_contrib_conclusion Conclusion Hopefully this results in an environment in which people are comfortable working, ultimately resulting in the best code we can produce as a community. Please let us know if you have any questions or comments- we would love to hear them. Thank you again for the interest you have expressed in the Adobe Source Libraries and the contributions you have made thus far! */ --- NEW FILE: preface.dox --- /*! \page asl_foreword Personal Foreword <i>It is a start...</i> \par That is my thought as I am preparing this release of the Adobe Source Libraries. There is some wonderful code here, and it is my hope that it will spark further research and development. \par If you look at the surface of a software product, what you will likely see is something mechanical. The illusion presented is that you are directly manipulating an underlying model: if you push here you know what will happen (or what should happen). If you push there, something else. \par Under the surface is a very non-mechanical system. Most implementations would be better described as "organic": a morass of objects loosely interconnected with messaging systems. The system is not random, it is likely carefully designed using any number of well established methodologies. \par The real architecture of the system, however, is the structure formed by the individual datum and logical interconnections. Software is defined on algebraic structures. \par This theme is recurrent throughout ASL and is reflected in many aspects, including: - The reliance on value semantics, rather than reference or pointer semantics, as the mechanism to control connections. - Stating the requirements of algorithms in terms of semantic concepts rather than interfaces. - Making connections explicit and using explicit data structure, notable in the lack of inheritance as a coupling mechanism. <i>It is a good start...</i> \par As these libraries are incorporated into Adobe's products they will replace tens of thousands of lines of code with simple and short declarations. The Eve layout engine has already saved Adobe significant man effort in localization. \par The most ambitious library, Adam, stems from the intuition that the logic behind a simple human interface can be distilled to a function: \par <center> \f$ f(x) \rightarrow x' \f$ </center> \par The code providing this functionality accounts for a third of Adobe's code base and nearly half of the bugs found during development. Obviously these functions are not so simple, at least not as currently expressed. The apparent complexity is due to a high degree of interconnected variables. Event handling code alone does not have enough context for solving such systems. <i>There is still much to do...</i> \par I have found that the better my understanding of the problem and solution, the simpler the code becomes. Conversely, each insight also brings more to do. Within each small library, a new body of work opens up. To illustrate: \par <i>The full_order_iterator in adobe::forest is not an iterator at all. It needs to be reconsidered as a new category of "visitor". I believe there is some overlap here with iterating N-dimensional containers and containers composed of segments (i.e. a deque). The related notion of a segmented iterator also appears in the implementation of adobe::circular_queue. There is some significant and needed work on algorithms for segmented sequences and formalizing the concepts for segmented iterators and non-sequential visitors.</i> \par If this foreword sounds somewhat apologetic this is why. I would love to release ASL as a completed work, but I know that there will always be work remaining. \par Still, I am convinced that writing correct, high performance, and feature rich systems can be orders of magnitude simpler than it currently is. By my estimate, 70% of Adobe's current code base could be better represented declaratively. The remaining imperative logic could be largely generic - reused both within and across Adobe's applications. Realizing even a fraction of this potential would open up a world of opportunities. I strongly suspect the proportions are similar throughout the industry. \par Why would Adobe give such technology away? The answer is twofold. First, we want to give back to the wonderful open source community which gives us so much. Second, we are releasing ASL because we want these problems to be solved. We want to be able to see our designs turned into quality products. We believe that technology that helps us build better products will make us a stronger company. We want to build Photoshop and Acrobat and not struggle with the small implementation details. And we realize the problem is far larger than us alone. \par If you are reading this I hope you find a use for these libraries, be it large or small. When you are writing your code please keep my above thoughts in mind; maybe even contribute something back to the effort. Lastly, if you are a software researcher in industry or academia, it is my hope that you will find some open territory here to explore. <i>It is a start...</i> <i>In Gratitude</i> \par I would be remiss without thanking a number of people for their efforts in putting together this library. Any ranking would be unfair, so I list them here in some kind of lexicographical order. - Boost - ASL relies heavily on the Boost libraries and freely borrows ideas and techniques pioneered by the many great Boost contributors. Feel free to borrow back. - Foster Brereton, who has been my wingman working on ASL and Eve before there was ASL. This release would not have happened without him. - Greg Gilley, my boss, who has provided shelter for the Software Technology Lab and the support necessary to make this happen. - Grant Munsey, who opened the doors at Adobe to open source. We hope you continue to get better. - Martin Newell, whose Boxes program sparked the idea that led to Eve and whose support gave me time to explore countless iterations of Adam. - The Photoshop team, especially Andrew Coven, Scott Byer, Joe Ault, and (ex-Photoshop member) Mark Hamburg. They have listened to me ramble incoherently for countless hours as I have struggled to form the ideas expressed here. - Bob Pierce, who authored each of the Adobe open source licenses. - Alex Stepanov who, more than anyone, has shaped how I think about software. Initially, through his work on the Standard Template Library. Now, as a personal friend and colleague he pushes me to learn more and to seek real problems and solutions. His constant pushing has transformed my code from a hack to less of a hack. It is a start. - Bjarne Stroustrup, the C++ Standards Committee, and the C++ community, who provided a language with which I can attempt to express my ideas. - Those that have taken the time to review and contribute to ASL including, Doug Ahmann, Bob Archer, Eric Berdahl, Florin Trofin, Tony Van Eerd, John Yen. - My wife, Tricia, for her loving support. \par And of course, thanks to anyone whom I have somehow forgotten and to you for your interest. <i>Sean Parent</i> February 25, 2005 */ --- NEW FILE: mainpage.dox --- /*! \mainpage notitle <h1>Welcome to opensource.adobe.com</h1> <em>"Correctness is clearly the prime quality. If a system does not do what it is supposed to do, then everything else about it matters little."</em> <br> - Bertrand Meyer <br> Adobe's open source web site is the home for the Adobe Source Libraries (ASL) and information about other Adobe open source projects. ASL provides peer-reviewed and portable C++ source libraries. The libraries are intended to be widely useful, leveraging and extending both the C++ Standard Library and the Boost Libraries. opensource.adobe.com is maintained by Sean Parent and Foster Brereton. <br> \section main_search Search \htmlonly <div align="center"> <form method=get action="http://search.yahoo.com/search" target="_new"> <input type="hidden" name="fr" value="yscpb"> <input type="hidden" name="vs" id="ysvs1" style="vertical-align: middle" value="opensource.adobe.com"> <table align="center"> <tr> <td rowspan="2" valign="center"> <a href="http://search.yahoo.com/"> <img src="http://us.i1.yimg.com/us.yimg.com/i/us/search/ysan/ysanlogo.gif" border="0" style="vertical-align: middle"> </a> </td> <td> <input type="text" name="p" size="29"> <input type="submit" value="Search"> </td> <tr> <td> <font size="-2">Search opensource.adobe.com</font> </td> </tr> </table> </form> </div> \endhtmlonly \section main_news Latest News \subsection main_news_2005_04_01 April 01, 2005 - ASL 1.0.2 Released The Adobe Source Libraries 1.0.2 is now available for \ref main_download. Changes include a budding Win32 implementation of Adobe Begin, increased compiler compatibility, and extensive bug fixes and additions. The Win32 implementation of Adobe Begin does not have the same functionality as the Mac version, however it is in a place where it demonstrates the functionality of Adam and Eve well enough to warrant release. \subsection main_news_2005_03_08 March 08, 2005 - RSS Feeds Available SourceForge.net has a series of RSS feeds available to update you on the latest happenings with the Adobe Source Libraries. The feeds can be found <a href="http://sourceforge.net/export/rss2_project.php?group_id=132417" target="_new">here</a> or you can use the following links directly: \htmlonly <ul> <li><a href="http://sourceforge.net/export/rss2_projnews.php?group_id=132417"><img src="http://images.sourceforge.net/images/xml.png" border="0" alt="RSS Feed Available" width="36" height="14" style="vertical-align: middle"></a> Latest news</li> <li><a href="http://sourceforge.net/export/rss2_projnews.php?group_id=132417&rss_fulltext=1"><img src="http://images.sourceforge.net/images/xml.png" border="0" alt="RSS Feed Available" width="36" height="14" style="vertical-align: middle"></a> Latest news (with full text)</li> <li><a href="http://sourceforge.net/export/rss2_projfiles.php?group_id=132417"><img src="http://images.sourceforge.net/images/xml.png" border="0" alt="RSS Feed Available" width="36" height="14" style="vertical-align: middle"></a> File releases</li> </ul> \endhtmlonly \subsection main_news_2005_03_07 March 07, 2005 - Adam Tutorial Posted A command-line application that demonstrates Adam has been added to the CVS repository. The Adam tutorial will <i>not</i> build with the ASL 1.0.1 release; you must have the current state of the CVS repository to build it. For CVS help please see \ref asl_download_cvs. The Adam tutorial has been tested to build with CodeWarrior, Darwin gcc (bjam), and MSVC. \subsection main_news_2005_02_25 February 25, 2005 - ASL 1.0.1 Preview Released We are happy to announce the release of the Adobe Open Source Libraries to the public. We have documentation and some tutorials available (\ref asl_home), as well as sources and binaries available for \ref main_download. A good place to start is by reading the \ref asl_foreword and \ref asl_overview. \section main_information Information - \ref asl_foreword - \ref asl_overview - \ref asl_contributing \section main_projects Projects - \ref asl_home - <a href="http://www.adobe.com/products/xmp/" target="_new">Adobe XMP</a> \section main_download Download - Downloading of the Adobe Source Libraries is handled through <a href="http://sourceforge.net/projects/adobe-source/" target="_new">SourceForge.net</a>. - We also have documentation on \ref asl_download_cvs \htmlonly <div align="center"><a href="http://sourceforge.net" target="_new"><img src="http://sourceforge.net/sflogo.php?group_id=132417&type=1" width="88" height="31" border="0" alt="SourceForge.net Logo"/></a></div> \endhtmlonly */ --- NEW FILE: asl_home.dox --- /*! \defgroup asl_home Adobe Source Libraries */ |
|
From: Foster B. <fos...@us...> - 2005-04-18 21:15:55
|
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/future/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/future/source Added Files: assemblage.cpp iomanip.cpp iomanip_pdf.cpp iomanip_xml.cpp Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: assemblage.cpp --- /* Copyright 2005 Adobe Systems Incorporated Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt or a copy at http://opensource.adobe.com/licenses.html) */ /*************************************************************************************************/ #include <adobe/future/assemblage.hpp> #include <adobe/algorithm.hpp> /*************************************************************************************************/ namespace adobe { /*************************************************************************************************/ assemblage_t::assemblage_t() { } /*************************************************************************************************/ assemblage_t::~assemblage_t() { // disconnect all our connections adobe::for_each(connections_m, boost::bind(&connection_t::disconnect, _1)); /* REVISIT (sparent) : This should be adobe::for_each_reverse(destruct_signal_m, adobe::apply()); */ for (destruct_signal_t::iterator last(destruct_signal_m.end()), first(destruct_signal_m.begin()); first != last; ) { --last; (*last)(); } } /*************************************************************************************************/ assemblage_t::connection_t& assemblage_t::hold_connection(const connection_t& connection) { connections_m.push_front(connection); return *connections_m.begin(); } /*************************************************************************************************/ void assemblage_t::signal_destruction(const destruct_slot_t& slot) { destruct_signal_m.push_back(slot); } /*************************************************************************************************/ } // namespace adobe /*************************************************************************************************/ --- NEW FILE: iomanip.cpp --- /* Copyright 2005 Adobe Systems Incorporated Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt or a copy at http://opensource.adobe.com/licenses.html) */ /*************************************************************************************************/ #ifdef ADOBE_SERIALIZATION /*************************************************************************************************/ #include <adobe/future/iomanip.hpp> /*************************************************************************************************/ namespace adobe { /*************************************************************************************************/ namespace implementation { /*************************************************************************************************/ bool type_string(const std::type_info& t) { return (t == typeid(std::string) || t == typeid(const std::string) || t == typeid(char*) || t == typeid(const char*)); } /*************************************************************************************************/ bool type_float(const std::type_info& t) { return (t == typeid(double) || t == typeid(const double) || t == typeid(float) || t == typeid(const float)); } /*************************************************************************************************/ bool type_integer(const std::type_info& t) { return (t == typeid(int) || t == typeid(const int) || t == typeid(unsigned int) || t == typeid(const unsigned int) || t == typeid(long) || t == typeid(const long) || t == typeid(unsigned long) || t == typeid(const unsigned long) || t == typeid(short) || t == typeid(const short) || t == typeid(unsigned short) || t == typeid(const unsigned short)); } /*************************************************************************************************/ bool type_bool(const std::type_info& t) { return (t == typeid(bool) || t == typeid(const bool)); } /*************************************************************************************************/ bool type_name(const std::type_info& t) { return (t == typeid(name_t)); } /*************************************************************************************************/ } // namespace implementation /*************************************************************************************************/ const name_t bag_name_g("bag"); const name_t seq_name_g("seq"); const name_t alt_name_g("alt"); const name_t atom_name_g("atom"); /*************************************************************************************************/ int format_base_idx() { static const int idx(std::ios_base::xalloc()); return idx; } format_base* get_formatter(std::ostream& os) { return static_cast<format_base*>(os.pword(format_base_idx())); } /*************************************************************************************************/ // format_manip_boilerplate is a standard iostream manipulator boilerplate, that will get the adobe // iomanip format object currently installed and call the relative function in that object. #define glue(x) x #define format_manip_boilerplate(x) \ format_base::stream_type& glue(x)(format_base::stream_type& os) \ { \ format_base* format(get_formatter(os)); \ if (format) format->glue(x)(os); \ return os; \ } /*************************************************************************************************/ format_manip_boilerplate(begin_format) format_manip_boilerplate(end_format) format_manip_boilerplate(end_bag) format_manip_boilerplate(begin_sequence) format_manip_boilerplate(end_sequence) format_manip_boilerplate(begin_alternate) format_manip_boilerplate(end_alternate) format_manip_boilerplate(end_atom) /*************************************************************************************************/ template <> std::ostream& fmt(std::ostream& os, const bool& t) { // In the case of a bool we don't necessarily want boolalpha (or NOT boolalpha). // For the time being we'll just use true and false but we need to hook a format // specific result for a true or false boolean value. os << adobe::begin_atom(typeid(const bool)) << (t ? "true" : "false") << adobe::end_atom; return os; } /*************************************************************************************************/ template <> std::ostream& fmt(std::ostream& os, const float& t) { // In the case of a floating-point number we want to // reduce it to an integer if there is no decimal value. long int_version(static_cast<long>(t)); if (int_version == t) { os << adobe::format(int_version); } else { os << adobe::begin_atom(typeid(const float)) << t << adobe::end_atom; } return os; } /*************************************************************************************************/ template <> std::ostream& fmt(std::ostream& os, const double& t) { // In the case of a floating-point number we want to // reduce it to an integer if there is no decimal value. long int_version(static_cast<long>(t)); if (int_version == t) { os << adobe::format(int_version); } else { os << adobe::begin_atom(typeid(const double)) << t << adobe::end_atom; } return os; } /*************************************************************************************************/ template <> std::ostream& fmt(std::ostream& os, const adobe::value_t& t) { // The pain about an adobe::value_t is that you need to // figure out all the different types that are in it // that you want to override (for example, double and bool). if (implementation::type_float(t.type())) { os << adobe::format(t.get<double>()); } else if (implementation::type_bool(t.type())) { os << adobe::format(t.get<bool>()); } else { os << adobe::begin_atom(t.type()) << t << adobe::end_atom; } return os; } /*************************************************************************************************/ } // namespace adobe /*************************************************************************************************/ #endif /*************************************************************************************************/ --- NEW FILE: iomanip_pdf.cpp --- /* Copyright 2005 Adobe Systems Incorporated Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt or a copy at http://opensource.adobe.com/licenses.html) */ /*************************************************************************************************/ #ifdef ADOBE_SERIALIZATION /*************************************************************************************************/ #include <adobe/future/iomanip_pdf.hpp> /*************************************************************************************************/ namespace adobe { /*************************************************************************************************/ void pdf_format::begin_format(stream_type& os) { push_stack(os, new pdf_format_element(name_t("pdf"))); } /*************************************************************************************************/ void pdf_format::begin_bag(stream_type& os, const std::string& ident) { push_stack(os, new pdf_format_element(bag_name_g, ident)); } /*************************************************************************************************/ void pdf_format::begin_sequence(stream_type& os) { push_stack(os, new pdf_format_element(seq_name_g)); } /*************************************************************************************************/ void pdf_format::begin_atom(stream_type& os, const std::type_info& typeinfo) { push_stack(os, new pdf_format_element(atom_name_g, typeinfo)); } /*************************************************************************************************/ void pdf_format::stack_event(stream_type& os, bool is_push) { pdf_format_element* top(my_stack_top()); name_t self(top ? top->tag() : "ERROR"); name_t parent(stack_depth() >= 2 ? stack_n(1)->tag() : ""); name_t grandparent(stack_depth() >= 3 ? stack_n(2)->tag() : ""); if (is_push) { if (self == static_name_t("pdf")) { os << "% pdf output\n"; } else if (self == bag_name_g) { if (parent != atom_name_g) os << indents(depth()); os << "<<\n"; up(); } else if (self == seq_name_g) { if (parent != bag_name_g) { if (parent != atom_name_g) os << indents(depth()); os << "[ "; } } else if (self == atom_name_g) { handle_atom(os, is_push); } } else { if (self == static_name_t("pdf")) { os << "% end pdf output\n"; } else if (self == bag_name_g) { down(); os << indents(depth()) << ">>"; if (parent != atom_name_g) { os << "\n"; } } else if (self == seq_name_g) { if (parent == bag_name_g) { os << "\n"; } else { os << "]"; if (parent != atom_name_g) { os << "\n"; } } } else if (self == atom_name_g) { handle_atom(os, is_push); } } } /*************************************************************************************************/ void pdf_format::handle_atom(stream_type& os, bool is_push) { pdf_format_element* top(my_stack_top()); name_t self(top ? top->tag() : "ERROR"); name_t parent(stack_depth() >= 2 ? stack_n(1)->tag() : ""); name_t grandparent(stack_depth() >= 3 ? stack_n(2)->tag() : ""); if (!top) return; const std::type_info& top_type(top->type()); if (is_push) { if (implementation::type_string(top_type)) { if (parent != seq_name_g) os << indents(depth()); if (parent == seq_name_g && grandparent == bag_name_g && my_stack_n(1)->num_out_m == 0) os << indents(depth()) << "/"; else os << "("; } else if (implementation::type_name(top_type)) { if (parent == seq_name_g && grandparent == bag_name_g && my_stack_n(1)->num_out_m == 0) os << indents(depth()); os << "/"; } else if (implementation::type_float(top_type)) { // For PDF, we want to output floating-point values in decimal-based // fixed-point notation (PDF doesn't support any other format) with // a very high precision for accceptable roundtrip values. os.setf(std::ios_base::dec, std::ios_base::basefield); os.setf(std::ios_base::fixed, std::ios_base::floatfield); os.precision(15); } // other data type format stuff goes here } else { if (parent == seq_name_g && grandparent == bag_name_g && my_stack_n(1)->num_out_m == 0) ; else { if (implementation::type_string(top_type)) { os << ")"; } else if (implementation::type_float(top_type)) { // For PDF, we want to output floating-point values in decimal-based // fixed-point notation (PDF doesn't support any other format) with // a very high precision for accceptable roundtrip values. os.setf(std::ios_base::dec, std::ios_base::basefield); os.setf(std::ios_base::fixed, std::ios_base::floatfield); os.precision(15); } // other data type format stuff goes here } if (parent == seq_name_g) { my_stack_n(1)->num_out_m++; os << " "; } else if (implementation::type_name(top_type)) os << " "; else os << "\n"; } } /*************************************************************************************************/ pdf_format_element* pdf_format::my_stack_top() { return my_stack_n(0); } /*************************************************************************************************/ pdf_format_element* pdf_format::my_stack_n(std::size_t n) { format_base::stack_element_type element(stack_n(n)); return dynamic_cast<pdf_format_element*>(element); } /*************************************************************************************************/ std::ostream& begin_pdf(std::ostream& os) { replace_pword<format_base, pdf_format>(os, format_base_idx()); os << begin_format; return os; } /*************************************************************************************************/ std::ostream& end_pdf(std::ostream& os) { os << end_format; return os; } /*************************************************************************************************/ } // namespace adobe /*************************************************************************************************/ #endif /*************************************************************************************************/ --- NEW FILE: iomanip_xml.cpp --- /* Copyright 2005 Adobe Systems Incorporated Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt or a copy at http://opensource.adobe.com/licenses.html) */ /*************************************************************************************************/ #ifdef ADOBE_SERIALIZATION /*************************************************************************************************/ #include <adobe/future/source/iomanip_xml.hpp> /*************************************************************************************************/ namespace adobe { /*************************************************************************************************/ void xml_format::begin_format(stream_type& os) { push_stack(os, new xml_format_element(name_t("xml"))); } /*************************************************************************************************/ void xml_format::begin_bag(stream_type& os, const std::string& ident) { push_stack(os, new xml_format_element(bag_name_g, ident)); } /*************************************************************************************************/ void xml_format::begin_sequence(stream_type& os) { push_stack(os, new xml_format_element(seq_name_g)); } /*************************************************************************************************/ void xml_format::begin_atom(stream_type& os, const std::type_info& typeinfo) { push_stack(os, new xml_format_element(atom_name_g, typeinfo)); } /*************************************************************************************************/ void xml_format::stack_event(stream_type& os, bool is_push) { xml_format_element* top(my_stack_top()); name_t self(top ? top->tag() : "ERROR"); name_t parent(stack_depth() >= 2 ? stack_n(1)->tag() : ""); name_t grandparent(stack_depth() >= 3 ? stack_n(2)->tag() : ""); if (is_push) { if (self == static_name_t("xml")) { os << indents(depth()) << "<xml>\n"; } else if (self == bag_name_g) { os << "<dict>\n"; up(); } else if (self == seq_name_g) { if (parent != bag_name_g) { os << "<array>\n"; up(); } } else if (self == atom_name_g) { handle_atom(os, is_push); } } else { if (self == static_name_t("xml")) { os << indents(depth()) << "</xml>\n"; } else if (self == bag_name_g) { down(); os << indents(depth()) << "</dict>"; if (parent != atom_name_g) os << "\n"; } else if (self == seq_name_g) { if (parent != bag_name_g) { down(); os << indents(depth()) << "</array>"; if (parent != atom_name_g) os << "\n"; } } else if (self == atom_name_g) { handle_atom(os, is_push); } } } /*************************************************************************************************/ void xml_format::handle_atom(stream_type& os, bool is_push) { xml_format_element* top(my_stack_top()); name_t self(top ? top->tag() : "ERROR"); name_t parent(stack_depth() >= 2 ? stack_n(1)->tag() : ""); name_t grandparent(stack_depth() >= 3 ? stack_n(2)->tag() : ""); if (!top) return; const std::type_info& self_type(top->type()); if (is_push) { if (self != seq_name_g) os << indents(depth()); if (parent == seq_name_g && grandparent == bag_name_g && my_stack_n(1)->num_out_m == 0) os << "<key>"; else { if (implementation::type_string(self_type)) os << "<string>"; else if (implementation::type_integer(self_type)) os << "<integer>"; else if (implementation::type_float(self_type)) os << "<double>"; else if (implementation::type_name(self_type)) os << "<ident>"; } } else { if (parent == seq_name_g && grandparent == bag_name_g && my_stack_n(1)->num_out_m == 0) os << "</key>"; else { if (implementation::type_string(self_type)) os << "</string>"; else if (implementation::type_integer(self_type)) os << "</integer>"; else if (implementation::type_float(self_type)) os << "</double>"; else if (implementation::type_name(self_type)) os << "</ident>"; } if (parent == seq_name_g) my_stack_n(1)->num_out_m++; if (self != seq_name_g) os << "\n"; } } /*************************************************************************************************/ xml_format_element* xml_format::my_stack_top() { return my_stack_n(0); } /*************************************************************************************************/ xml_format_element* xml_format::my_stack_n(std::size_t n) { format_base::stack_element_type element(stack_n(n)); return dynamic_cast<xml_format_element*>(element); } /*************************************************************************************************/ std::ostream& begin_xml(std::ostream& os) { replace_pword<format_base, xml_format>(os, format_base_idx()); os << begin_format; return os; } /*************************************************************************************************/ std::ostream& end_xml(std::ostream& os) { os << end_format; return os; } /*************************************************************************************************/ } // namespace adobe /*************************************************************************************************/ #endif /*************************************************************************************************/ |
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/documentation/sources/asl/related In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/documentation/sources/asl/related Added Files: adam_language_reference.dox asl_overview.dox eve_language_reference.dox reference_expression_section.dox Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: asl_overview.dox --- /*! \defgroup asl_overview Overview \ingroup asl_home \author Sean Parent, Adobe Systems Incorporated \author Foster Brereton, Adobe Systems Incorporated \date December 6, 2004 \section asl_overview_abstract Abstract \par This document serves as an overview to the Adobe Source Libraries (ASL). The goal of ASL is to develop the technology necessary to construct commercial applications by assembling generic algorithms through declarative descriptions. \par The first two significant libraries in ASL are known as Adam and Eve. They are components for modeling the human interface appearance and behavior in a software application. Adam and Eve are described along with related libraries. \par ASL is a project within the Adobe Software Technology Lab (STLab); a research group chartered with increasing developer productivity and software quality through better technologies and education. \par Adobe Begin is a sample application aimed at implementing the ideas expressed herein. A \ref widget_reference is available to assist users in the creation of dialogs. There are also many prebuilt dialogs provided from which you can learn by example. \section asl_overview_toc Table of Contents \par -# \ref asl_overview_intro_to_adam_and_eve -# \ref asl_overview_terminology -# \ref asl_overview_history -# \ref asl_overview_goals_for_adam -# \ref asl_overview_adam_goal_1 -# \ref asl_overview_adam_goal_2 -# \ref asl_overview_adam_goal_3 -# \ref asl_overview_adam_goal_4 -# \ref asl_overview_adam_goal_5 -# \ref asl_overview_understanding_adam -# \ref asl_overview_understanding_adam_modelling_controller -# \ref asl_overview_adam_and_eve_architecture -# \ref asl_overview_adam_and_eve_architecture_overview -# \ref asl_overview_adam_and_eve_expression_language -# \ref asl_overview_adam_and_eve_adam -# \ref asl_overview_adam_and_eve_virtual_machine -# \ref asl_overview_adam_and_eve_eve2 -# \ref asl_overview_adam_and_eve_eve2_parser -# \ref asl_overview_adam_and_eve_eve2_types -# \ref asl_overview_adam_and_eve_eve2_ves -# \ref asl_overview_adam_and_eve_eve2_binding -# \ref asl_overview_adam_and_eve_eve2_guides -# \ref asl_overview_adam_and_eve_eve2_dynamic_evaluation -# \ref asl_overview_adam_and_eve_eve2_outsets_etc -# \ref asl_overview_library_integration -# \ref asl_overview_open_issues -# \ref asl_overview_grammars -# \ref asl_overview_future_ideas -# \ref asl_overview_future_ideas_expresso2 -# \ref asl_overview_future_ideas_eve2 \section asl_overview_intro_to_adam_and_eve Introduction to Adam and Eve \par Adam is a modeling engine and declarative language for describing constraints and relationships on a collection of values, typically the parameters to an application command. When bound to a human interface (HI) Adam provides the logic that controls the HI behavior. Adam is similar in concept to a spreadsheet or a forms manager. Values are set and dependent values are recalculated. Adam provides facilities to resolve interrelated dependencies and to track those dependencies, beyond what a spreadsheet provides. \par Eve consists of a declarative language and layout engine for constructing an HI. The layout engine in Eve takes into account a rich description of UI elements to achieve a high quality layout - rivaling what can be achieved with manual placement. A single HI description in Eve suffices for multiple OS platforms and languages. This document describes Eve2, the latest version of Eve. Eve2 was developed to work with Adam and to incorporate many improvements that have been requested since Eve1 was written. \par It is important to note that Adam and Eve do not constitute a traditional application framework. They are component libraries which can be incorporated into a number of environments. They can be used together, or independently, but must be combined with other facilities to construct an application. Nearly all of the components which comprise Adam and Eve can also be used independently and are documented as part of ASL. \par ASL is being developed in C++, and relies heavily on the Boost libraries <http://www.boost.org/> which are required for building ASL. \section asl_overview_terminology Terminology \par Eve: Refers to the Eve technology in general (see section 3). Where the differences between the original Eve and the one documented here is important, either Eve1 or Eve2 is used. \section asl_overview_history Brief History Of Adam & Eve \par <i>"In the beginning the programmer created the language and the code. And the code was without form, and <code>void</code>; and darkness was upon the screen of the computer. And the programmer moved upon the keyboard of the computer. And the programmer said, let there be Photoshop: and there was Photoshop. And the programmer saw Photoshop, that it was good: and the programmer divided the Command Parameter Modeling Code from the Underlying Framework."</i> - The Book of Photoshop 1:1-4 \par Eve (the name is derived from Express View Engine) is a layout engine and declarative language for constructing a human interface (HI) layout. Eve was developed originally for Photoshop (a prototype version was used in Photoshop 5) and has since seen gradual evolution and integration into other Adobe applications. \par Development on Adam began in between Eve and Eve2. The discovery was made that the same technology Eve relies upon for HI element layout can also be used to model the behaviors of those elements. Adam is the result of that technology reworked to fit command parameter modeling requirements. Adam is currently being integrated into several Adobe applications. \par Eve2 is the next generation of Eve. With an improved language and engine, it solves many problems the original Eve engine could not handle. Eve2 is also written with integration into Adam in mind, but also written separate from Adam so the two engines need not coexist. Like Adam, Eve2 is not formally a member of any shipping Adobe product, but is currently being integrated into several Adobe applications. \section asl_overview_intro_to_adam_and_eve Introduction to Adam & Eve \par Eve was developed with three primary goals and two requirements. \par Goals: -# Make it easier to specify and modify the layout of a human interface. -# Have a single definition of the interface for all platforms. -# Have a single definition of the interface for all languages. \par Requirements: -# Must allow piecemeal incorporation into an application, freeing the entire human interface from being converted to Eve in one pass. -# Generate layouts as good or better than those generated by hand. \par Meeting this requirement 1 led to architecture for Eve that is easy to incorporate into most any application framework. \par These goals and requirements were met. Goal 3 relies on a tokenized string system also developed for Photoshop. \par The following example is used throughout this document. It is introduced here to give a feel for what Adam and Eve are and what they do. A simple Eve description of a dialog looks like this: \verbatim dialog(name: "Clipping Path") { column(child_horizontal: align_fill) { popup(name: "Path:", bind: @path, items: [ { name: "None", value: empty }, { name: "Path 1", value: 1 }, { name: "Path 2", value: 2 } ]); edit_number(name: "Flatness:", digits: 9, bind: @flatness); } button(name: "OK", default: true, bind: @result); } \endverbatim \par <i>Note:</i> All examples in this document use Eve2. The differences between Eve1 and Eve2 are described in \ref asl_overview_adam_and_eve_eve2. For brevity, strings are shown in a simplified form. Normally, a tokenized string system would be used. \par \image html clippingpath.jpg "Figure 1: The Clipping Path dialog described above in Mac OS X" \par Eve1 generates a static layout for an interface. All dynamic aspects (including adjusting the layout if the content or window size is changed) are handled in application code. Binding the HI elements to code is done by adding additional ID attributes. These IDs are looked up to manipulate the HI in response to events. \par Eve has enough information to act in a dynamic fashion, handling the adjustment to the layout and content. This has led to expanding Eve into the role of a "display system". This new system is bound to a "model" which manages the description of what is to be viewed while Eve handles how it is displayed. \par In this case, the model is not the document model (as is typical in a model/view/controller pattern) but instead is a model of the parameters to the command the user is preparing for execution (see \ref asl_overview_understanding_adam). Adam manages the constraints and relationships amongst the parameters taking input from HI events, and feeding information back to Eve for display. \par The <code>bind</code> attributes used in the Eve clipping path example bind the components of a view definition to "cells" in an Adam sheet. The Adam sheet is declared as: \verbatim sheet clipping_path { output: result <== { path: path, flatness: flatness }; interface: unlink flatness : 0.0 <== (path == empty) ? 0.0 : flatness; path : 1; } \endverbatim \par Binding the numeric text field to the flatness cell in the Adam sheet binds the HI display to the value in this field as well as to the dependency state of the cell. The text field will toggle between empty and the last user-entered value as the popup is switched between "None" and one of the available paths in the document. When "None" is selected the text field will also be dimmed (in a disabled state) because the output value of the flatness cell does not depend on its input value; entering text would have no effect on the output so the control can be correctly disabled. \par Although Adam calculates values that Eve2 can display, Adam is entirely independent of Eve2. It is possible to use Adam as an application's modeling engine and completely replace the layout engine or even drive the application by scripting alone. Adam handles the script validation with the same model it uses to control the HI. \par Although Adam and Eve are being developed to solve problems with application HI development for Adobe products, there are other possible uses of the technology. Adam and Eve could be applied to form layout and logic, web application front-end development, web page layout and logic, or document style sheet layout. \par It may also be possible to extend the concepts in Adam and Eve to apply to the document model within an application. Such a technology could untangle applications from the various frameworks upon which they are built and simplify code sharing between applications. \section asl_overview_goals_for_adam Goals for Adam \par The goals of the Adam project are lofty - in part because for Adam to be successful it has to be a significantly better way to build the HI component of our applications. \subsection asl_overview_adam_goal_1 Decreasing the Effort Required to Construct an Interface \par Ask nearly any software engineer what they hate doing most and the answer will be "building the human interface." Even working on products where Eve has been adopted, and the engineers are freed from much of the mundane tasks such as getting a button at just the right pixel location; the effort to build the human interface is onerous. In fact, the code associated with the human interface accounts for nearly 1/3 of the code necessary to implement a feature within Adobe applications. Contrast that to the framework code, which accounts for roughly 1/10th of the code in our applications and the potential impact of this project becomes apparent. \par Adam seeks to provide a clear format for modeling what is now managed with complicated event handling code. It also reduces the amount of redundant logic and consolidates common logic for reuse and sharing. Adam is targeted to replace the current code necessary to implement an interface with a description roughly 1/10th the size and complexity. \subsection asl_overview_adam_goal_2 Increase the Quality of the Interface Implementation \par As noted above, there is significant code in Adobe products to manage the HI, and one would expect a proportionate number of bugs. But in reality the number of HI-related bugs is disproportionately high (An explanation for this is detailed below). In sampling one of every 500 bugs in Photoshop's 20,000-bug database, roughly half (in this case it was exactly half) of the bugs fell into the interface layer that Adam targets. These bugs tend to be of lower severity than other bugs but still represent a significant impact on resources. Reviewing bugs across a range of Adobe products revealed that roughly 40% of Adobe products' bugs are "behavioral" in nature. Many of these bugs (4 out of 20 in the Photoshop sampling) simply could not have happened using Adam. Other bugs, though they may still occur, will be easier to find and fix or will be eliminated altogether by moving more of the implementation closer to the design process. \subsection asl_overview_adam_goal_3 Allow Interfaces to be Shared Across Products \par Adobe's applications have been acquired from other companies and developed internally over more than a decade. Over time, platform requirements have changed and the products have been ported and adapted. The result is that no two major applications are built upon the same application framework. \par Increasingly, our applications are expected to share significant HI elements as they are merged into suites and move beyond the role of an isolated domain to a component in a larger workflow. Areas such as file and asset management, text, color, metadata, web optimization, and transparency, are all expected to be both well integrated into each application and common amongst all of them. Eve has enabled some level of interface layout sharing already. \par At odds against application integration and code sharing exist the disparity between frameworks and object models between applications. Even when the layout is shared, the underlying implementation cannot be shared while still meeting the requirement of being well integrated. The result is that the code comprising the logic behind the dialog is replicated for each application using the client application model for views and event handling. This is a significant amount of duplicated code and effort. Adam seeks to consolidate that logic and allow it to be moved and customized easily between our applications regardless of the underlying framework. \subsection asl_overview_adam_goal_4 Shifting HI Development to the Designer \par Currently, a human interface designer is responsible for designing the visuals and may provide some textual description of the behavior. This work is done using graphical tools, such as Photoshop, to draw the interface and annotations are added to describe the behavior. The design is then given to an engineer who "codes" both the layout and the behavior. Sometimes the requested behaviors violate the requirements of the underlying command, forcing the engineer to go back to the designer and resolve the conflicts. It is only after the design is fully implemented by the engineer that significant user testing can take place, usually requiring rework and one or more iterations through the process. \par A visual tool (\ref asl_overview_future_ideas_expresso2) built around Eve2 would allow the designer to layout the visuals for an interface in a form that could be used directly by the application developer. Incorporating Adam support into such a tool would serve to increase the communication between the development engineer and interface designer by surfacing the constraints and allowing the designer to experiment with correctly functioning interfaces. \subsection asl_overview_adam_goal_5 Provide an Improved Environment for Localization \par A tokenized string system can be successful in isolating what needs to be localized within an application. However, a major problem that still remains to be solved is determining the context of a string for the appropriate translation. It is a goal to be able to provide this context information in Expresso2 in the form of a "show-me" command. This will be able to pull up the appropriate dialog(s) where the string appears. In the case of validation messages, the parent dialog can be displayed as well as the Adam rule that will cause the message to be displayed. \section asl_overview_understanding_adam Understanding Adam \par The design of Adobe's professional applications follow a typical model, view, controller pattern. The model represents the document being edited, and the view is the display of the document within a window. The "controller" is a collection of commands that can be used to modify the document. These commands follow a command pattern (see Gamma, et. al. p. 233) and execute against the document as an undoable transaction. \par \image html parameter_flow.jpg "Figure 2: The typical flow of command parameters within an application" \par Most of our applications follow this diagram or some variation on the pattern. In this pattern, information from defaults or preferences, or possibly from a script, are combined with state information about the target document. This information, possibly with information provided by the user, is then used to construct the parameters to a command. The command is then executed against the document. If this transaction completes successfully (it may fail if resources are insufficient or the user cancels the operation) then the settings for the command are sent to the scripting system for recording and saved in the preferences. The shaded box is where the command parameters are input by the user and/or validated before handing them off for processing. This is the area that Adam is focused, with facilities to bind into the rest of the application architecture. \par The parameters for a command may be dependent on, or defaulted based on, the state of the document model. \par \image html edit_text_example.jpg "Figure 3: The Edit Text Field Depending Upon the State of the Popup" \par The figure above illustrates what happens as part of the command parameter handling process. This is a depiction of the clipping path example used above. (Note that the command interface is not limited to modal dialogs- palette interfaces and direct manipulations also construct command parameters. Adam and Eve can be applied in these cases as well). Information is fed into the system from a set of defaults (usually what the user selected last) or a script and combined with information from the current document state. This information is fed to the dialog setup code that populates fields and controls within the dialog. (The controls have been formatted either from an appropriate resource description or using Eve). As the controls in the interface are manipulated events are generated and other controls are updated in response to reflect validated parameters. Finally, usually in response to the user selecting "OK", the information from the HI fields is gathered, a final validation occurs, the dialog is taken down, and the parameters are sent off for processing. In cases were there is no "cross-talk" between items in the dialog, the behaviors can be coded as simple validating filters attached to each item (for example, a filter on a text edit field that only accepts numbers). More complicated filters can handle simple ranges of values - or combine a couple of HI elements into a standard cluster (like an edit text field bound to a slider). However, even with these simplifications there is duplication of validation code between the scripting validation and that scattered amongst the HI elements. There is custom code required to set-up, teardown, and manage the interaction of the dialog (in very trivial cases the interaction may be managed completely by stock filters). \par Although this "simple" example does not show it, the interrelationships will quickly exceed the number of items, bounded by <i>(N<sup>2</sup> - N)</i> directional relationships for a fully connected set. A dialog can get prohibitively complicated. For example, the Layer Effects dialog in Photoshop 6 has over 250 elements. Although the interaction between elements is somewhat limited, the resulting complexity is still significant. A dialog such as Image Size only has a handful of items, but is fully interconnected. The resulting pages of logic, despite having been worked on across several releases of Photoshop, are an ongoing source of bugs and bug fixes. Even when implemented with the utmost care, these fixes frequently generate other defects. \par All of the code in these event-based systems is tightly bound both to the application framework and to the application document model. This tight coupling prohibits the code from being reused within another application. \subsection asl_overview_understanding_adam_modelling_controller Modelling the Controller \par In more complicated cases (such as a slider connected to an edit text field) the result is a tangle of circular dependencies. A deeper analysis reveals that the cycles are created because the HI controls are providing two functions - they are both a display and an input. By logically separating these two functions the circular dependencies are broken. Much of the logic that was in the event handlers, script validation, setup, and teardown can now be collapsed into a single "model". What we are left with is a traditional model / view / controller pattern with the HI controls acting as both view and controller. This is depicted in Figure 4. What is being modeled is the parameters to the command that is being constructed. This model is independent of the HI that is bound to it, allowing the designer greater flexibility in changing the layout and the choice of HI elements without impacting the underlying model. \par \image html adam_mvc_design.jpg "Figure 4: HI Widgets Acting as Both View and Controller Being Split by Adam" \par This consolidation alone reduces the complexity of the system from <i>(N<sup>2</sup> - N)</i> to simply <i>N</i>. Further, the logic that was replicated between the script validation and the dialog validation can now be shared. Because there is a single model containing the state of the system some of the relationships that had to be coded individually before can now be encapsulated into simple "rules" applied to the system as a whole. For example, any HI designer will tell you that an interface element should be visually disabled if, given the current state of the other interface items, it would have no effect. In a typical event handling system there is no way to determine what will or will not have an effect. With Adam, this rule can be expressed once for the application rather than once for each element that contributes to the enabled state of another. \par The Adam modeling system is conceptually similar to a traditional spreadsheet. Cells are named with text identifiers rather than being organized into a row / column layout and grouped into a "sheet". A "sheet" is similar to a C structure, except data members are cells that can have expressions attached which are evaluated when dependent members are modified. The dependency engine is bidirectional, allowing for queries on a given state such as "what input cells effect the output cells." These types of queries are used to drive the enabled state within the controller (if an input cannot affect any output then the controller attached to the input cell is disabled). The reverse dependency lookup is also used for invariant testing, enabling the engine to report what input cells contributed to an invariant violation, not just that one occurred.. \section asl_overview_adam_and_eve_architecture Adam & Eve Architecture \subsection asl_overview_adam_and_eve_architecture_overview Overview \par \image html adam_and_eve.jpg "Figure 5: The Basic Components of Adam And Eve and How They Interrelate" \par There are two major components: the parsers and the engines. Eve1 has its own language loosely based on a C syntax. The parser in Eve1 is coupled to the Eve1 engine, making it difficult to provide alternate syntaxes. For Eve2 and Adam the engines are completely decoupled from the language allowing for alternate syntaxes to be developed by providing a parser. Optionally, a formatter can also be provided for direct generation from an Eve2 DOM and Adam sheet. The most obvious choice for an additional syntax is XML, although many other forms have been suggested (direct to HTML, classic Eve, CSS, JavaScript, Java Swing, and platform resources). \subsection asl_overview_adam_and_eve_expression_language The Adam Expression Language \par The Adam Expression Language (AEL) has been developed as a base expression language for both Adam and Eve2. The syntax borrows heavily from Eve1 and continues in the "C style". An XML based language was considered but rejected because every attempt has led to a language that is verbose and difficult to read. Even with a good visual editor it is expected that text based editing will be the preferred form of editing Adam and Eve descriptions for some users. However, an XML based language as an alternative is not being rejected in general. \par The AEL is being designed from the outset to support round-trip editing and good error reporting. The new parser is LL2 and has a simple lexical analyzer. Comments are incorporated into the grammar (not simply consumed as white space by the lexical analyzer) to support round-trip editing with a visual editor. \par For more information on AEL see the Adam \ref adam_reference. \subsection asl_overview_adam_and_eve_adam Adam \par As previously mentioned, an Adam sheet is similar to a C struct. A sheet consists of cell members. Cell members may be of type input, output, interface, logic, constant or invariant. \par The example given in the introduction is a sheet specification: \verbatim sheet clipping_path { output: result <== { path: path, flatness: flatness }; interface: unlink flatness : 0.0 <== (path == empty) ? 0.0 : flatness; path : 1; } \endverbatim \par [Open Issue 1] An invariant is an output cell of type Boolean. A handler can be attached to an invariant that will be called if the invariant evaluates to false. The handler is supplied the name of the invariant, as well as a list of the input cells upon which the invariant is dependent. The default handler throws an exception of type adam::invariant_violation(). \par To understand how Adam achieves such expressive power, consider the statement: \verbatim unlink flatness : 0.0 <== (path == empty) ? 0.0 : flatness; \endverbatim \par As C++ code, this statement would simply mean: - When executed, evaluate \c path's output and assign \c empty or \c flatness' input to \c flatness' output accordingly. \par As an Adam statement the following is implied: - Whenever \c path's output is modified, assign either \c flatness' input or \c empty to \c flatness' output. - If \c path's output does not equal \c empty, and \c flatness' input is modified, then update \c flatness' output. \par Further, the following queries can be made: - Given a current state, which input cells have an effect upon output cells? - Given a current state, upon which input values is \c flatness' output dependent? - Which of the values upon which \c flatness' output is currently dependent was updated most recently? \par And, finally, actions can be associated with the results of any of the above statements - such as: - When \c flatness' output is modified, update the display. - Set the enabled state of the edit text field associated with \c flatness' input according to whether \c flatness' input affects any output values, and update it when that state changes. \par The more inter-related statements there are in a sheet, the higher the effective expressive power of Adam is relative to a traditional event model. The single statement above replaces a 57 line (15 statements by semicolon count) function in Photoshop. \par An instance of a sheet is a copy-on-write object in order to support transactional operations. This is useful in implementing undo and it may be used to implement reset and revert to respond to an invariant violation. [Note: copy-on-write could also be used to implement multiple undo within dialogs if we consider this feature useful.] \par [Open issue 2] The input cells on a sheet can be loaded from a dictionary and the output cells can be extracted as a dictionary. This functionality can be used to implement load, save, "favorites", and presets as well as being a useful way to bind a sheet to the application. \par Modifying an input cell on a sheet triggers a recalculate (this can be suppressed for setting up a complex state). Any cells dependent on a changed value are recalculated. If an invariant cell returns false on a recalculation an exception is thrown containing the name of the invariant that was violated, as well as any cells (based on the current state of the sheet) that triggered the invariant. [Note, it may also be useful to provide a list of all input cells upon which the invariant is dependent. A notion of a "weak invariant" may also be useful that would halt propagation and cause any further dependent output cells to go to an "invalid" state. This will require further experience to see what is needed.] \par Logic cells are used for intermediate calculations and their state can neither be read nor set from outside the sheet. \par Interface cells are used for both input and output. Normally an interface cell's input and output values stay in sync with one another. It is possible to prefix an interface cell with the "unlink" keyword, preventing back propagation of the output value to the input value. \par [Open Issue 3] [Open Issue 4] Sometimes an interface is dependent upon the notion of what happened most recently. For example - an edit text field displaying "width" in a resize dialog my either display what the user typed into width or what was calculated when the user changed height. To support this notion, Adam maintains a generation count on the sheet that is incremented with each recalculation. Cells are stamped with the generation count when they are modified as the result of a recalculation. \subsection asl_overview_adam_and_eve_virtual_machine Virtual Machine \par The Virtual Machine is a simple stack machine for evaluating expressions. An expression is reduced to a code sequence where each code represents either a value or an operand. Values are pushed, and operands are applied to values on the top of the stack, pushing the result. An infix expression can be reconstructed from the sequence by overriding the operators. This is useful for roundtrip editing. Conceptually AVM is very similar to FORTH or the PostScript language and supports pushing a code sequence as a value. \par In Adam, dependencies are tracked by monitoring cell lookups during execution of statements. Lookup is deferred until actual execution. The short-circuit Booleans and conditional operator take expressions as parameters, so which cells are marked as being dependent on a given expression is dependent on the current state of the sheet. \par [Open Issue 5] it may be desirable to delay evaluation of parameters to functions until the function requests evaluation. Although that would complicate scoping rules, it would allow function to be written that conditionally used their parameters and hence would do a better job at tracking dependencies. \subsection asl_overview_adam_and_eve_eve2 Eve2 Overview \par Eve1, as it exists today, has a number of shortcomings that hinder its use and adoption. Eve2 is being developed both to overcome a number of these shortcomings as well as to support bindings to Adam sheets. This section details the changes and additions to Eve2. \subsubsection asl_overview_adam_and_eve_eve2_parser Parser \par In Eve1, the parser and layout engine are tied together. Eve2 fully uncouples the parser from the layout engine allowing for alternate parsers (and formatters) to be developed (formatters are used for round-trip editing). The Eve2 parser leverages the Adam Expression Language. \subsubsection asl_overview_adam_and_eve_eve2_types Types \par Eve2 supports the string, integer, and Boolean types. Eve2 leverages the richer type system of AEL. This is used for specifying items such as spacing as an array to allow for variant spacing without the use of additional nested containers. \subsubsection asl_overview_adam_and_eve_eve2_ves Variables, Expressions, and Scopes \par One of the strengths of Eve1 is its use of variables, expressions, and its scoping rules. However, the power of this system has also been a primary area of abuse. Eve1 users frequently try to "calculate" results that would be better left to the engine to solve, and use it to describe "exceptional" layouts that would be better handled in the client code. The Eve2 architecture makes it a fairly trivial task to support an even more powerful variable system (more powerful because of the type and expression extensions provided by AEL), however, variable declarations have been explicitly omitted from Eve2. The idea is to guide developers to the improved coding practices outlined above. The scope rules are still in place and available to the client and engine for looking up "contextual" information (such as spacing and fonts). \subsubsection asl_overview_adam_and_eve_eve2_binding Binding \par A key feature of Eve2 is the ability to bind an HI element to a cell in an Adam sheet. Binding is done through various bind attributes. The value of a bind attribute is the name of an Adam cell or cells. For example: \verbatim check_box(name: "Check this", bind: @check_this); \endverbatim \par A name can also be used to bind other attributes to a sheet. For example, if the name of the above check box is something set by the user, this may appear as: \verbatim check_box(name: @user_name, bind: @check_this); \endverbatim \subsubsection asl_overview_adam_and_eve_eve2_guides Guides \par Guides are a generalization of what the label_width and top_inset attributes were in Eve1. In Eve2 guides will be able to handle cross hierarchy connections to allow <i>n</i>-column alignment and baseline alignment. For the most part, guides will behave automatically - invisible to the user (set by the client code and solved by the engine). [Note: There currently exists a good algorithm for finding guide correspondence. The algorithm for solving the positions is problematic but should be sufficient to do "more than Eve1" in the initial implementation.] \subsubsection asl_overview_adam_and_eve_eve2_dynamic_evaluation Dynamic Evaluation \par Resizing a view, either directly because of a user dragging out the size or in response to a change in content or state, is directly analogous to laying out the contents of a view with some additional constraints (such as the minimum size of the enclosing view). After Eve1 was developed the realization came that it could also be used to control the resize logic. The only problem was that the Eve engine was tangled with the parser and so could not adjust a layout after a programmatic change. Eve2 untangles this dependency and provides an API for adjusting attributes and forcing a recalculate of the layout. \subsubsection asl_overview_adam_and_eve_eve2_outsets_etc Outsets and Container Geometry \par In Eve1 outsets are intended to ensure space is available for drop shadows, default highlights, OS control "slop", and the like. Some effort is made to adjust the size and location of items based on the outsets, however, this logic is currently flawed, and can lead to both improper outsets as well as improper placement and sizing of items. Correcting this flaw, especially with the addition of guides, would add considerable complexity to the engine. However, when used properly, outsets should not affect the location or size of an item and doing so leads to a visual defect in the appearance of the dialog. Rather, outsets are intended to be "absorbed" by white-space (such as a margin or space between items). Eve2 will apply the outsets correctly in a post-pass after layout. If a size or location adjustment is necessary a diagnostic will be output, but the layout will not be altered. \par Eve1 also has no notion of the visual geometry of the frame of a container; rather margins on the frame are adjusted to include the frame. Eve2 adds the notion of a frame and an inset (a different notion than the poorly named inset in Eve1 which should have been named indent). This make it easier for the client code to specify the geometry of a container (the code can set a fixed frame width instead of continually adding the frame to the margin) and allow for better detection of improper overlap in the post-pass. \section asl_overview_library_integration Library Integration \par The integration of ASL into client code is fairly straightforward. Because ASL does not rely on inheritance for integration into client code, the integration process is more about adding support code than converting code already present. Figure 6 outlines a possible integration of ASL into client code. \par \image html codebase.jpg "Figure 6: ASL Code Integration and Client Support Code" \par There are clear boundaries between ASL code, client code, and the support code required to bind ASL to the client. Processes shaded in red represent code required of the client. Processes shaded in blue are provided by the ASL. OS routines are shaded in green. \par The process begins with Adam and Eve definitions describing an interface (a dialog, for example). The client supplies code to read in these definitions and relay them to the respective parsers for Adam and Eve. The parsers should interact with another suite of support code out the other side, which will relay pertinent information to Adam and Eve. Note too that the parser-to-engine support code might interact with widget set support code in initializing controls, windows, and the like. Adam and Eve will execute over the data provided to them, and communicate results to widget set support code. This code will convert data and parameters from the two engines into information useable by the OS. The application relating to the OS should be done at the client support code level. When the OS calls back to the client with events and data, the client support code should relay pertinent information back to Adam and Eve. Adam and Eve will update necessary parameters and send the notifications to the client support code, which relays important information back to the OS (a new wiget value, for example). This cycle of OS/Client/ASL/Client/OS will continue as the user interacts with the interface, and is the "event loop" model with Adam and Eve integrated. \par Most of the client integration code is fairly simple. The most complex piece of code is the widget support set as callbacks from Adam, Eve, their respective parsers, and the OS come together. Even then, the widget set support code is complex in terms of size, not algorithmic complexity. The code for a given routine is often just a matter of filtering and translating data, then routing that data to the appropriate destination. The most complicated processes in client code should lie outside this model. After all, this code is the means by which parameters are constructed for processes; the process itself should be independent of this code. \section asl_overview_open_issues Appendix - Other Open Issues \par - Currently Adam is loosely typed. It may be desirable to be able to declare a type for a cell and have the type enforced. If this is done, then a qualifier "optional" will be added to denote that the field could also contain "empty". - Investigating XForms. Structured sheets and sheet inclusion. \section asl_overview_grammars Appendix - Grammars \par The grammars in this document are expressed using EBNF (Extended Backus-Naur Form) notation. EBNF is defined in the ISO-14977 standard. Available from the <a href="http://webstore.ansi.org/ansidocstore/product.asp?sku=ISO%2FIEC+14977%3A1996">ANSI web site in PDF</a> for a cost of $38.00. The final draft of the document is also <a href="http://www.cl.cam.ac.uk/~mgk25/iso-14977.pdf">available for free online</a>. \par There are currently four grammars. They can be found in the following files: - \ref adam_reference - \ref eve_reference - \ref expression_reference (describes the lexical grammar and the expression grammar) \section asl_overview_future_ideas Appendix - Future Ideas \subsection asl_overview_future_ideas_expresso2 Expresso2 \par Expresso2 is to be the visual editor for Adam and Eve. It will be built as a tool for HI designers. It will retain a double editor view (outline and preview) but the preview window will also support direct manipulation. A source view (ala GoLive) may also be provided. \par Some support will be provided to simplify the process of cross platform previewing. The incorporation of Adam will allow for active simulations. \par To make localization simpler, a reverse lookup will be implemented (find all instances of a string and display the appropriate context). \subsection asl_overview_future_ideas_eve2 Features Under Consideration For Eve2 \par An API for directly manipulating the Eve hierarchy could be useful for very dynamic views. Being able to bind a value to a node in a view allows for some simple direct setting of values - but not for structure manipulation. An XPath interface onto the Eve hierarchy could be a useful future addition. \par A maximum size constraint for a layout would be very useful for palettes. Currently you can set a minimal size that is of some use but requires hand inspection and adjustments for localization. A minimal solution would allow for an alternate view definition if a size constraint were violated. Another option would be to gracefully degrade the layout (breaking guide links, and formatting options) to force a dialog to fit. A combination of these two would most likely eliminate significant localization effort. \par A previous experimental version of Eve could adjust a layout for word wrapped text. This was fairly straightforward to implement and will most likely make it into a release of Eve2. \par The ability to directly specify menu items was not possible in Eve1 because the dataset was not rich enough and custom container layout was not allowed. In Eve2 there are several ways a client could support this feature. \par Adobe applications are currently moving to allow for custom key bindings at the application level. If this feature were to be extended into dialogs it may be desirable to have a feature in Eve or in a tokenized string system to support this. At this time however, there are no suggestions as to how such a feature would be implemented. */ --- NEW FILE: eve_language_reference.dox --- /*! \defgroup eve_reference Eve Language Reference \ingroup asl_home Eve is a runtime library (see \ref eve_engine). The Eve Language and \ref eveparser are facilities provided to make it easier to assemble an adobe::eve_t from a simple declaration. This manual describes the Eve Language. The language is divided into three parts, \ref expression_lexical_conventions, \ref expression_expressions, and \ref view_declarations. The first two parts are shared by the Adam Language, and describe in the \ref expression_reference. \section view_declarations View Declarations \subsection eve_grammar Eve Grammar \verbatim view_definition = [lead_comment] view_class_decl ((";" [trail_comment]) | ([trail_comment] view_statement_list). view_statment_sequence = { view_definition }. view_class_decl = ident "(" [ named_argument_list ] ")". view_statment_list = "{" view_statement_sequence "}". \endverbatim */ --- NEW FILE: adam_language_reference.dox --- /*! \defgroup adam_reference Adam Language Reference \ingroup asl_home Adam is a runtime library (see \ref adam_engine). The Adam Language and \ref adamparser are facilities provided to make it easier to assemble an adobe::sheet_t from a simple declaration. This manual describes the Adam Language. The language is divided into three parts, \ref expression_lexical_conventions, \ref expression_expressions, and \ref sheet_declarations. The first two parts are shared by the Eve Language, and describe in the \ref expression_reference. \section sheet_declarations Sheet Declarations \subsection adam_grammar Adam Grammar \verbatim translation_unit = { sheet_specifier }. sheet_specifier = [lead_comment] "sheet" identifier "{" { qualified_cell_decl } "}" [trail_comment]. qualified_cell_decl = interface_set_decl | input_set_decl | output_set_decl | constant_set_decl | logic_set_decl | invariant_set_decl. interface_set_decl = "interface" ":" { [lead_comment] interface_cell_decl }. input_set_decl = "input" ":" { [lead_comment] input_cell_decl }. output_set_decl = "output" ":" { [lead_comment] output_cell_decl }. constant_set_decl = "constant" ":" { [lead_comment] constant_cell_decl }. logic_set_decl = "logic" ":" { [lead_comment] logic_cell_decl }. invariant_set_decl = "invariant" ":" { [lead_comment] invariant_cell_decl }. interface_cell_decl = ["unlink"] identifier [initializer] [define_expression] end_statement. input_cell_decl = identifier [initializer] end_statement. output_cell_decl = named_decl. constant_cell_decl = identifier initializer end_statement. logic_cell_decl = named_decl | relate_decl. invariant_cell_decl = named_decl. relate_decl = [conditional] "relate" "{" relate_expression relate_expression { relate_expression } "}" [trail_comment]. relate_expression = [lead_comment] named_decl. named_decl = identifier define_expression end_statement. initializer = ":" expression. conditional = "when" "(" expression ")". define_expression = "<==" expression. end_statement = ";" [trail_comment]. keywords += "sheet" | "interface" | "input" | "output" | "constant" | "logic" | "invariant" | "unlink" | "when" | "relate" \endverbatim \subsection cell_qualifiers Cell Access Specifiers \subsection initialization Initialization \subsection advanced_features Advanced Features \subsubsection external_types External Types and Functions Although there are a set of types provided by the language, the type system is extensible to support any C++ type through external functions and values introduced from outside of the system. For example, if an external function were provided to supply an image, other functions could be provided to operator on that image. External functions can be provided through the virtual machine API [ref]. An external function to get an image from a URL might look this: \code struct image_type { /* some image structure */ }; image_type get_image_for_url(const char* url); // Some external function to get an image adobe::value_t get_image(const adobe::array_t& parameters) { return adobe::value_t(get_image(parameters[0].get<std::string>().c_str())); } \endcode A function to operate on the image might look like this: \code void guassian_blur(image_type& image); // Some external operation adobe::value_t blur_image(const adobe::array_t& parameters) { image_type result = parameters[0].get<image_type>(); guassian_blur(result); return result; } \endcode After registering these functions with the virtual machine - the following expressions are valid: \verbatim get_image("http:\\local\my_image.jpg") == get_image("http:\\local\my_other_image.jpg") blur_image(get_image("http:\\local\my_image.jpg")) \endverbatim */ --- NEW FILE: reference_expression_section.dox --- /*! \defgroup expression_reference Expression Reference \ingroup asl_home \section expression_lexical_conventions Lexical Conventions The language parser operates on a C++ istream with the locale set to the standard "C" locale. Spaces, tabs, and line endings (composed of cr, lf, or (cr, lf) ) are considered white space and are ignored, except as they separate tokens. \subsection lexical_grammar Lexical Grammar \verbatim simple_token = "+" | "-" | "*" | "/" | "%" | "?" | ":" | "=" | "!" | "{" | "}" | "<" | ">" | ";" | "@". compound_token = "&&" | "||" | "<=" | ">=" | "==" | "!=". string = quoted_string { quoted_string }. lead_comment = "/*" {character} "*/". trail_comment = "//" {character} eol. identifer = (letter | "_") {letter | "_" | digit}. keywords = "empty" | "true" | "false" | <extension>. number = digits ["e" ["+" | "-"]] digits. quoted_string = '"' {character} '"' | "'" {character} "'". digits = digit { digit }. \endverbatim \subsection comments Comments Comments are lexical tokens to facilitate the editing and subsequent formatting of the language in alternate representations. The trail_comment is terminated by any form of line ending. \subsection strings Strings Strings can be quoted either with single or double quotation marks. Adjacent strings are concatenated into a single string. There are no quote characters within a string. It is expected that the text within the string represents a higher-level representation (such as XML) which can provide additional mark-up. \subsection keywords Keywords The \c empty, \c true, and \c false keywords represent the associated values (the \c empty value corresponds to adobe::empty_t). The list of keywords can be extended by dependent grammars. \subsection numbers Numbers: Numbers are always 64 bit IEEE double precision values. \todo (sparent) : Lexical conventions for hexadecimal constants may be added in the future. \section expression_expressions Expressions The expression syntax and semantics are designed to closely resemble the C language. Expressions are dynamically typed and there is no implicit type coercion between types. \subsection expression_grammar Expression Grammar \verbatim expression = or_expression ["?" expression ":" expression]. or_expression = and_expression { "||" and_expression }. and_expression = equality_expression { "&&" equality_expression }. equality_expression = relational_expression { ("==" | "!=") relational_expression }. relational_expression = additive_expression { ("<" | ">" | "<=" | ">=") additive_expression }. additive_expression = multiplicative_expression { ("+" | "-") multiplicative_expression }. multiplicative_expression = unary_expression { ("*" | "/" | "%") unary_expression }. unary_expression = postfix_expression | (unary_operator unary_expression). unary_operator = "+" | "-" | "!". postfix_expression = primary_expression { ("[" expression "]") | ("." identifier) }. primary_expression = name | number | boolean | string | "empty" | array | dictionary | variable_or_fuction | ( "(" expression ")" ). variable_or_function = identifier ["(" [argument_expression_list] ")"]. array = "[" [argument_list] "]". dictionary = "{" named_argument_list "}". argument_expression_list = named_argument_list | argument_list. argument_list = expression { "," expression }. named_argument_list = named_argument { "," named_argument }. named_argument = identifier ":" expression. name = "@" identifier. boolean = "true" | "false". \endverbatim \subsection types Types \subsubsection boolean boolean Values of type \c boolean are either \c true or \c false. \subsubsection name name A name is a literal identifier. Names are used as keys for dictionaries [see dictionary_t] and can be used as enumerations would be used in C. \subsubsection number number Numbers are always 64 bit IEEE double precision values. \subsubsection string string A value of type \c string can be any sequence of non '\\0' characters. \subsubsection empty empty A value of type \c empty has only the single value of \c empty. \subsubsection array array An \c array is a heterogeneous (any type, including arrays and dictionaries may be placed in an array) ordered sequence. Arrays support random access through the index operator. See [indexing] \subsubsection dictionary dictionary A \c dictionary is a heterogeneous SortedAssociativeContainer that associates objects of type \c name (the key) with objects of any type. It is also a UniqueAssociativeContainer, no two elements have the same key. \subsection operators Operators \subsubsection operator_index Index Operator An \c array or \c dictionary may be indexed by an expression in square brackets. For an \c array, the expression must evaluate to a \c number, the floor of which will be used as a zero based integer index. For a \c dictionary, the expression must evaluate to a \c name. If the indexed item does not exist in the container a runtime exception is thrown. A \c dictionary may also be indexed using the dot operator where the following identifier is evaluated as a name. The following two expressions are equivalent: \code dict[@my_name] dict.my_name \endcode \subsubsection operator_unary Unary Operators The operand for unary \c + and \c - must be of type \c number. The unary \c - operator returns the negative of the operand. The unary \c + operator is ignored, and provided for symmetry with unary \c -. The operand for \c ! must be of type \c boolean. The result is \c true if the operand is \c false. The result is \c false if the operand is \c true. \subsubsection operator_multiplicative Arithmetic Operators The operands for \c +, \c -, \c *, \c /, and \c \% must be of type \c number. The result of the binary operator \c + is the sum of the operands. The result of the binary operator \c - is the difference of the operands. Operators \c * and \c / respectively denote floating point multiplication and division. The \c \% operator will truncate each operand to an integer and return the remainder. It is undefined if the remainder is negative if one of the operands is negative. \todo (sparent) : The \% operator is left over from Eve1 which supported only integer arithmetic. It will likely be redefined in the future to be a proper floating point modulus. \subsubsection operator_logical Logical Operators The operands for \c && and \c || must be of type \c boolean. The result of the \c && and \c || operator is of type \c boolean denoting the logical-and or logical-or of the operands. The first operand is evaluated and if it is \c false for && or \c true for || then the second operand is not evaluated. \todo (sparent) : [move this discussion down to a section on evaluating sheets.] The tracking of "considered" in Adam is currently handled at too course a granularity, an item is considered if is evaluated - there are some interesting issues with short circuit booleans - for example, for logical-or if the second operand evaluates to true - the value of the first operand doesn't matter. Was it considered? Similarly, does it contribute to the result. The answer today is yes for both of these but this may be revisited. \subsubsection operator_relational Relational Operators The operands for \c \< (less than), \c > (greater than), \c \<= (less than or equal to), and \c >= (greater than or equal to) must be of type \c number. The result is of type \c boolean. \subsubsection operator_equality Equality Operators The operands for \c == (equal) and \c != (not equal) can be of any type. If the operands are not of the same type then they will compare as not equal. \subsubsection operator_conditional Conditional Operator The conditional operator takes three operands, separated by \c ? and \c :. The first operand must be of type \c boolean. If the first operand is \c true, then the result is the second operand. If the first operand is \c false then the result is the third operand. Only one of the second and third expressions is evaluated. \subsection precedence Precedence and Order of Evaluation \todo (sparent) : Allowing for operator overloading on external types is a possible future extension. \subsection special_functions Special Functions <i>intentionally empty</i> \subsection supplied_functions Supplied Functions <i>intentionally empty</i> */ |
|
From: Foster B. <fos...@us...> - 2005-04-18 21:15:55
|
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/future In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/future Added Files: assemblage.hpp enum_ops.hpp find_closest.hpp iomanip.hpp iomanip_fwd.hpp iomanip_pdf.hpp iomanip_xml.hpp manip.hpp memory.hpp ternary_function.hpp Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: assemblage.hpp --- /* Copyright 2005 Adobe Systems Incorporated Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt or a copy at http://opensource.adobe.com/licenses.html) */ /*************************************************************************************************/ #ifndef ADOBE_ASSEMBLAGE_HPP #define ADOBE_ASSEMBLAGE_HPP #include <list> #include <vector> #include <boost/bind.hpp> #include <boost/signal.hpp> #include <boost/function.hpp> #include <adobe/functional.hpp> /*************************************************************************************************/ namespace adobe { /*************************************************************************************************/ class assemblage_t { public: typedef boost::signals::connection connection_t; typedef boost::function<void ()> destruct_slot_t; private: typedef std::list<connection_t> connections_t; #if 0 typedef boost::signal<void ()> destruct_signal_t; #endif typedef std::vector<destruct_slot_t> destruct_signal_t; public: assemblage_t(); ~assemblage_t(); connection_t& hold_connection(const connection_t& connection); void signal_destruction(const destruct_slot_t& slot); template <typename T> void delete_on_destruction(T& x) { adobe::delete_ptr<T> deleter; signal_destruction(boost::bind(deleter,x)); } private: connections_t connections_m; destruct_signal_t destruct_signal_m; int group_m; }; /*************************************************************************************************/ #if 0 #else namespace { template<class PairType> struct equal_to_first : std::unary_function<PairType, bool> { equal_to_first(const typename PairType::first_type& first) : first_m(first) { } bool operator() (const PairType& pair) const { return pair.first == first_m; } private: typename PairType::first_type first_m; }; } // namespace #endif /*************************************************************************************************/ } // namespace adobe /*************************************************************************************************/ #endif // ADOBE_ASSEMBLAGE_HPP /*************************************************************************************************/ --- NEW FILE: enum_ops.hpp --- /* Copyright 2005 Adobe Systems Incorporated Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt or a copy at http://opensource.adobe.com/licenses.html) */ /*************************************************************************************************/ /*! \file enum_ops.hpp is the header file for enumeration operations further described in \ref asldoc_enum_ops. */ /*************************************************************************************************/ /*! \defgroup asldoc_enum_ops Enum Operations Functions allowing for unary and binary operations on enumerated values. \{ <table cellpadding="0" cellspacing="0" width="100%" border="0"> <tr> <td align="left">\image html utilities.gif</td> <td width="100%"></td> <td align="right">\image html function.gif</td> </tr> <tr> <td align="left" valign="top"><b>Category</b>: utilities</td> <td width="100%"></td> <td align="right" valign="top"><b>Component type</b>: function</td> </tr> </table> \section Description Description The enumeration operations described here are a series of templated functions that allow for unary and binary logical operations to be performed on one or more enumerations matching constraints. There are currently two constraints that must be met in order for these operations to compile successfully. The first is that the enumerations must be of the same type (in the case of binary operations), and the second being that the \c enum_traits::value must be \c true (this is the case by default). In either case being \c false the compiler will issue a compile-time error. This suite of functions is valuable is for several reasons. First, \c enum_ops will limit all binary operations only to enumerations of the same type. Most compilers at present give only a warning at best, with most of them reporting nothing at all. Second, the enumeration is converted to its underlying type before performing the operation, then converted back; this increases portability. Third, developers can explicitly disable these operations for any enumeration type, thus increasing compile-time constraint validity checking. Note that \c enum_ops takes advantage of <code>boost::enable_if</code>, <code>boost::type_traits</code>, and <code>boost::is_enum</code>. As of this writing there are limitations to \c boost::is_enum as detailed in the Boost <a href="http://www.boost.org/libs/type_traits/">type_traits documentation</a>, so please keep these in mind when coding for specific compilers. Specifically, \c is_enum is currently broken up to Borland C++ Builder 5 (for constructor-based conversions) and for all Metrowerks compilers up to 7 (for all cases). \section Definition Definition Defined in \link enum_ops.hpp <code>adobe/enum_ops.hpp</code> \endlink \section Example Example The following is an example of code that will compile: \dontinclude enum_ops_example.cpp \skip start_of_example \until end_of_example The following is an example of code that will not compile for several reasons. The first example is a violation of \c enum type, the second is a violation of <code>enum_traits</code>: \dontinclude enum_ops_example_fail.cpp \skip start_of_example \until end_of_example */ #ifndef ADOBE_ENUM_SET_HPP #define ADOBE_ENUM_SET_HPP #include <boost/integer.hpp> #include <boost/type_traits.hpp> #include <boost/static_assert.hpp> #include <boost/utility/enable_if.hpp> /*************************************************************************************************/ namespace adobe { template <typename Enum> struct enum_traits { enum { value = true }; }; template <typename Enum> struct enum_unary_op_traits { enum { value = adobe::enum_traits<Enum>::value }; }; template <typename Enum1, typename Enum2> struct enum_binary_op_traits { enum { value = adobe::enum_traits<Enum1>::value && adobe::enum_traits<Enum2>::value }; }; namespace implementation { /* REVISIT (sparent) : All of these routines attempt to derive an appropriate underlying type for a given enum type. They rely on 8 bit chars - this method may be revisited. */ template <typename ScalarType> struct underlying_t { typedef typename boost::uint_t<8 * sizeof(ScalarType)>::least result_t; }; } // namespace implementation } // namespace adobe /*************************************************************************************************/ template <typename EnumType> inline typename boost::enable_if<boost::is_enum<EnumType>, EnumType>::type operator ~ (EnumType a) { BOOST_STATIC_ASSERT((adobe::enum_unary_op_traits<EnumType>::value)); typedef typename adobe::implementation::underlying_t<EnumType>::result_t underlying_t; return EnumType(~underlying_t(a)); } template <typename EnumType1, typename EnumType2> inline typename boost::enable_if<boost::is_enum<EnumType1>, EnumType1>::type operator | (EnumType1 a, EnumType2 b) { BOOST_STATIC_ASSERT((adobe::enum_binary_op_traits<EnumType1, EnumType2>::value)); BOOST_STATIC_ASSERT((boost::is_same<EnumType1, EnumType2>::value)); typedef typename adobe::implementation::underlying_t<EnumType1>::result_t underlying_t; return EnumType1(underlying_t(a) | underlying_t(b)); } template <typename EnumType1, typename EnumType2> inline typename boost::enable_if<boost::is_enum<EnumType1>, EnumType1>::type operator & (EnumType1 a, EnumType2 b) { BOOST_STATIC_ASSERT((adobe::enum_binary_op_traits<EnumType1, EnumType2>::value)); BOOST_STATIC_ASSERT((boost::is_same<EnumType1, EnumType2>::value)); typedef typename adobe::implementation::underlying_t<EnumType1>::result_t underlying_t; return EnumType1(underlying_t(a) & underlying_t(b)); } template <typename EnumType1, typename EnumType2> inline typename boost::enable_if<boost::is_enum<EnumType1>, EnumType1>::type operator ^ (EnumType1 a, EnumType2 b) { BOOST_STATIC_ASSERT((adobe::enum_binary_op_traits<EnumType1, EnumType2>::value)); BOOST_STATIC_ASSERT((boost::is_same<EnumType1, EnumType2>::value)); typedef typename adobe::implementation::underlying_t<EnumType1>::result_t underlying_t; return EnumType1(underlying_t(a) ^ underlying_t(b)); } template <typename EnumType1, typename EnumType2> inline typename boost::enable_if<boost::is_enum<EnumType1>, EnumType1>::type operator &= (EnumType1& lhs, EnumType2 rhs) { BOOST_STATIC_ASSERT((adobe::enum_binary_op_traits<EnumType1, EnumType2>::value)); BOOST_STATIC_ASSERT((boost::is_same<EnumType1, EnumType2>::value)); lhs = lhs & rhs; return lhs; } template <typename EnumType1, typename EnumType2> inline typename boost::enable_if<boost::is_enum<EnumType1>, EnumType1>::type operator |= (EnumType1& lhs, EnumType2 rhs) { BOOST_STATIC_ASSERT((adobe::enum_binary_op_traits<EnumType1, EnumType2>::value)); BOOST_STATIC_ASSERT((boost::is_same<EnumType1, EnumType2>::value)); lhs = lhs | rhs; return lhs; } template <typename EnumType1, typename EnumType2> inline typename boost::enable_if<boost::is_enum<EnumType1>, EnumType1>::type operator ^= (EnumType1& lhs, EnumType2 rhs) { BOOST_STATIC_ASSERT((adobe::enum_binary_op_traits<EnumType1, EnumType2>::value)); BOOST_STATIC_ASSERT((boost::is_same<EnumType1, EnumType2>::value)); lhs = lhs ^ rhs; return lhs; } /*************************************************************************************************/ /** \} */ /* END OF enum_ops group */ /*************************************************************************************************/ #endif /*************************************************************************************************/ --- NEW FILE: manip.hpp --- /* Copyright 2005 Adobe Systems Incorporated Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt or a copy at http://opensource.adobe.com/licenses.html) */ /*************************************************************************************************/ #ifdef ADOBE_SERIALIZATION /*************************************************************************************************/ #ifndef ADOBE_MANIP_HPP #define ADOBE_MANIP_HPP /*************************************************************************************************/ #include <iostream> /*************************************************************************************************/ namespace adobe { /*************************************************************************************************/ class manipulator_base { public: manipulator_base() : error_m(std::ios_base::goodbit) { } protected: template <typename StreamType> std::ios_base::iostate handle_error(StreamType& strm) const { std::ios_base::iostate err(error_m); try { throw; } catch (std::bad_alloc&) { set_bad(); std::ios_base::iostate exception_mask(strm.exceptions()); if (exception_mask & std::ios_base::failbit && !(exception_mask & std::ios_base::badbit)) strm.setstate(err); else if (exception_mask & std::ios_base::badbit) { try { strm.setstate(err); } catch (std::ios_base::failure&) { } throw; } } catch (...) { set_fail(); std::ios_base::iostate exception_mask(strm.exceptions()); if ((exception_mask & std::ios_base::badbit) && (err & std::ios_base::badbit)) strm.setstate(err); else if (exception_mask & std::ios_base::failbit) { try { strm.setstate(err); } catch (std::ios_base::failure&) { } throw; } } return err; } void set_fail() const { error_m |= std::ios_base::failbit; } void set_bad() const { error_m |= std::ios_base::badbit; } mutable std::ios_base::iostate error_m; }; /*************************************************************************************************/ template <typename ArgumentType, class charT, class traits> class basic_omanipulator : public manipulator_base { public: typedef ArgumentType argument_type; typedef std::basic_ostream<charT, traits> stream_type; typedef stream_type& (*manip_func)(stream_type&, const ArgumentType&); basic_omanipulator(manip_func pf, const ArgumentType& arg) : pf_m(pf), arg_m(arg) { } void do_manip(stream_type& strm) const { if (error_m != std::ios_base::goodbit) strm.setstate(error_m); else { std::ios_base::iostate err(error_m); try { (*pf_m)(strm, arg_m); } catch (...) { err = handle_error(strm); } if (err) strm.setstate(err); } } private: manip_func pf_m; protected: argument_type arg_m; }; /*************************************************************************************************/ template <typename ArgumentType1, typename ArgumentType2, class charT, class traits> class basic_omanipulator2 : public manipulator_base { public: typedef ArgumentType1 argument_type_1; typedef ArgumentType2 argument_type_2; typedef std::basic_ostream<charT, traits> stream_type; typedef stream_type& (*manip_func)(stream_type&, const ArgumentType1&, const ArgumentType2&); basic_omanipulator2(manip_func pf, const ArgumentType1& arg1, const ArgumentType2& arg2) : pf_m(pf), arg1_m(arg1) , arg2_m(arg2) { } void do_manip(stream_type& strm) const { if (error_m != std::ios_base::goodbit) strm.setstate(error_m); else { std::ios_base::iostate err(error_m); try { (*pf_m)(strm, arg1_m, arg2_m); } catch (...) { err = handle_error(strm); } if (err) strm.setstate(err); } } private: manip_func pf_m; protected: argument_type_1 arg1_m; argument_type_2 arg2_m; }; /*************************************************************************************************/ template <class ArgumentType, class charT, class traits> std::basic_ostream<charT, traits>& operator << (std::basic_ostream<charT, traits>& os, const adobe::basic_omanipulator<ArgumentType, charT, traits>& manip) { if (os.good()) manip.do_manip(os); return os; } /*************************************************************************************************/ template <class ArgumentType1, class ArgumentType2, class charT, class traits> std::basic_ostream<charT, traits>& operator << (std::basic_ostream<charT, traits>& os, const adobe::basic_omanipulator2<ArgumentType1, ArgumentType2, charT, traits>& manip) { if (os.good()) manip.do_manip(os); return os; } /*************************************************************************************************/ template <class charT, class traits> class basic_bounded_width : public basic_omanipulator<unsigned int, charT, traits> { typedef basic_omanipulator<unsigned int, charT, traits> inherited_t; public: typedef typename inherited_t::stream_type stream_type; typedef typename inherited_t::argument_type argument_type; basic_bounded_width(argument_type min, argument_type max) : basic_omanipulator<argument_type, charT, traits>(basic_bounded_width::fct, min), min_m(min), max_m(max) { } inherited_t& operator() (argument_type i) { inherited_t::arg_m = std::min(max_m, std::max(i, min_m)); return *this; } private: static stream_type& fct(stream_type& strm, const argument_type& i) { strm.width(i); return strm; } argument_type min_m; argument_type max_m; }; typedef basic_bounded_width<char, std::char_traits<char> > bounded_width; typedef basic_bounded_width<wchar_t, std::char_traits<wchar_t> > wbounded_width; /*************************************************************************************************/ } // namespace adobe /*************************************************************************************************/ #endif /*************************************************************************************************/ #endif /*************************************************************************************************/ --- NEW FILE: iomanip_xml.hpp --- /* Copyright 2005 Adobe Systems Incorporated Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt or a copy at http://opensource.adobe.com/licenses.html) */ /*************************************************************************************************/ #ifdef ADOBE_SERIALIZATION /*************************************************************************************************/ #ifndef ADOBE_IOMANIP_XML_HPP #define ADOBE_IOMANIP_XML_HPP /*************************************************************************************************/ #include <adobe/future/source/iomanip.hpp> /*************************************************************************************************/ namespace adobe { /*************************************************************************************************/ class xml_format_element : public format_element_base { typedef format_element_base inherited_t; public: xml_format_element(name_t tag = name_t(), std::string ident = std::string()) : inherited_t(tag), ident_m(ident), typeinfo_m(typeid(ident_m)), num_out_m(0) { } xml_format_element(name_t tag, const std::type_info& typeinfo) : inherited_t(tag), typeinfo_m(typeinfo), num_out_m(0) { } xml_format_element(const xml_format_element& rhs) : inherited_t(rhs), ident_m(rhs.ident_m), typeinfo_m(rhs.typeinfo_m), num_out_m(rhs.num_out_m) { } virtual format_element_base* copy() { return new xml_format_element(*this); } const std::type_info& type() { return typeinfo_m; } protected: friend class xml_format; std::string ident_m; const std::type_info& typeinfo_m; // sequence specific std::size_t num_out_m; }; /*************************************************************************************************/ class xml_format : public format_base { typedef format_base inherited_t; public: typedef inherited_t::stream_type stream_type; virtual void begin_format(stream_type& os); virtual void begin_bag(stream_type& os, const std::string& ident); virtual void begin_sequence(stream_type& os); virtual void begin_atom(stream_type& os, const std::type_info&); protected: virtual void stack_event(stream_type& os, bool is_push); private: virtual void handle_atom(stream_type& os, bool is_push); xml_format_element* my_stack_top(); xml_format_element* my_stack_n(std::size_t n); }; /*************************************************************************************************/ std::ostream& begin_xml(std::ostream& os); std::ostream& end_xml(std::ostream& os); /*************************************************************************************************/ } // namespace adobe /*************************************************************************************************/ #endif /*************************************************************************************************/ #endif /*************************************************************************************************/ --- NEW FILE: ternary_function.hpp --- /* Copyright 2005 Adobe Systems Incorporated Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt or a copy at http://opensource.adobe.com/licenses.html) */ /*************************************************************************************************/ #ifndef ADOBE_TERNARY_FUNCTION_HPP #define ADOBE_TERNARY_FUNCTION_HPP /*************************************************************************************************/ namespace adobe { /*************************************************************************************************/ template <typename T, typename U, typename V, typename R> struct ternary_function { typedef T first_argument_type; typedef U second_argument_type; typedef V third_argument_type; typedef R result_type; }; /*************************************************************************************************/ template <typename T, typename U, typename V, typename R> class pointer_to_ternary_function : public ternary_function<T, U, V, R> { public: typedef ternary_function<T, U, V, R> _super; typedef typename _super::first_argument_type first_argument_type; typedef typename _super::second_argument_type second_argument_type; typedef typename _super::third_argument_type third_argument_type; typedef typename _super::result_type result_type; explicit pointer_to_ternary_function(result_type (*f)(first_argument_type, second_argument_type, third_argument_type)) : f_m(f) { } result_type operator()(first_argument_type x, second_argument_type y, third_argument_type z) const { return f_m(x, y, z); } private: result_type (*f_m)(first_argument_type, second_argument_type, third_argument_type); }; /*************************************************************************************************/ template <typename T, typename U, typename V, typename R> inline pointer_to_ternary_function<T, U, V, R> ptr_fun(R (*f)(T, U, V)) { return pointer_to_ternary_function<T, U, V, R>(f); } /*************************************************************************************************/ } // namespace adobe /*************************************************************************************************/ #endif /*************************************************************************************************/ --- NEW FILE: find_closest.hpp --- /* Copyright 2005 Adobe Systems Incorporated Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt or a copy at http://opensource.adobe.com/licenses.html) */ /*************************************************************************************************/ #ifndef ADOBE_FIND_CLOSEST_HPP #define ADOBE_FIND_CLOSEST_HPP /*************************************************************************************************/ #include <iterator> #include <adobe/future/ternary_function.hpp> /*************************************************************************************************/ namespace adobe { /*************************************************************************************************/ /* find_closest takes a range and a value, and returns the closest value in the sequence to the value passed, for some definition of "closest". By default it compares the cardinal difference between the values to find the closest, though the client can pass their own TernaryPredicate to override this functionality. Preconditions: - The sequence to be searched must be sorted according to the comparison method used in the supplied TernaryPredicate. Postconditions: - As long as the size of the sequence is greater than 0, the result will always be a valid value inside the sequence. (i.e., the only time the end of the sequence is returned is when the sequence is empty). Additional Concepts: - Subtractable : Subtraction yields a difference type; T - T -> D - TernaryPredicate : A TernanyPredicate is called with three arguments and returns true or false. */ /*************************************************************************************************/ template < typename T // T models Subtractable > struct closer_predicate : ternary_function<T, T, T, bool> { typedef ternary_function<T, T, T, bool> _super; typedef typename _super::first_argument_type first_argument_type; typedef typename _super::second_argument_type second_argument_type; typedef typename _super::third_argument_type third_argument_type; typedef typename _super::result_type result_type; result_type operator () (const first_argument_type& a, const second_argument_type& b, const third_argument_type& x) const { // precondition: a <= b return x - a < b - x; } }; /*************************************************************************************************/ namespace implementation { /*************************************************************************************************/ template < typename I, // I models ForwardIterator typename D, // D models LessThanComparable typename T, // T models Subtractable typename C // C models TernaryPredicate > I find_closest(I first, D n, const T& value, C pred, std::forward_iterator_tag) { if (n < D(2)) return first; while (n != D(2)) { D third(n / D(3)); D new_n(n - third); I first_third(first); I last_third(first); std::advance(first_third, third); std::advance(last_third, new_n); if (!pred(*first_third, *last_third, value)) first = first_third; n = new_n; } I second(first); std::advance(second, 1); return pred(*first, *second, value) ? first : second; } /*************************************************************************************************/ template < typename I, // I models ForwardIterator typename D, // D models LessThanComparable typename T, // T models Subtractable typename C // C models TernaryPredicate > I find_closest(I first, D n, const T& value, C pred, std::random_access_iterator_tag) { if (n < D(2)) return first; while (n != D(2)) { D third(n / D(3)); D new_n(n - third); if (!pred(*(first + third), *(first + new_n), value)) first += third; n = new_n; } I second(first + 1); return pred(*first, *second, value) ? first : second; } /*************************************************************************************************/ } // namespace implementation /*************************************************************************************************/ template < typename I, // I models ForwardIterator typename D, // D models LessThanComparable typename T, // T models Subtractable typename C // C models TernaryPredicate > inline I find_closest(I first, D n, const T& value, C pred) { typedef typename std::iterator_traits<I>::iterator_category category; return implementation::find_closest(first, n, value, pred, category()); } /*************************************************************************************************/ template < typename I, // I models ForwardIterator typename D, // D models LessThanComparable typename T // T models Subtractable > inline I find_closest(I first, D n, const T& value) { typedef typename std::iterator_traits<I>::iterator_category category; return implementation::find_closest(first, n, value, closer_predicate<T>(), category()); } /*************************************************************************************************/ template < typename I, // I models ForwardIterator typename T, // T models Subtractable typename C // C models TernaryPredicate > inline I find_closest(I first, I last, const T& value, C pred) { typedef typename std::iterator_traits<I>::iterator_category category; return implementation::find_closest(first, std::distance(first, last), value, pred, category()); } /*************************************************************************************************/ template < typename I, // I models ForwardIterator typename T // T models Subtractable > inline I find_closest(I first, I last, const T& value) { typedef typename std::iterator_traits<I>::iterator_category category; return implementation::find_closest(first, std::distance(first, last), value, closer_predicate<T>(), category()); } /*************************************************************************************************/ } // namespace adobe /*************************************************************************************************/ #endif /*************************************************************************************************/ --- NEW FILE: iomanip_fwd.hpp --- /* Copyright 2005 Adobe Systems Incorporated Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt or a copy at http://opensource.adobe.com/licenses.html) */ /*************************************************************************************************/ #ifdef ADOBE_SERIALIZATION /*************************************************************************************************/ #ifndef ADOBE_IOMANIP_FWD_HPP #define ADOBE_IOMANIP_FWD_HPP /*************************************************************************************************/ #include <iosfwd> /*************************************************************************************************/ namespace adobe { /*************************************************************************************************/ class format_base; /*************************************************************************************************/ int format_base_idx(); format_base* get_formatter(std::ostream& os); /*************************************************************************************************/ } // namespace adobe /*************************************************************************************************/ #endif /*************************************************************************************************/ #endif /*************************************************************************************************/ --- NEW FILE: memory.hpp --- /* Copyright 2005 Adobe Systems Incorporated Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt or a copy at http://opensource.adobe.com/licenses.html) */ /*************************************************************************************************/ /*! \file <adobe/memory.hpp> augments the functionality of \<memory\>. Provided are: - improved auto_ptr template class. - auto_resource template class. - ptr_traits template class - runtime_cast template function. */ #ifndef ADOBE_MEMORY_HPP #define ADOBE_MEMORY_HPP #include <cassert> #include <functional> #include <memory> #include <adobe/functional.hpp> /*************************************************************************************************/ namespace adobe { /*************************************************************************************************/ template <typename T> struct empty_ptr; template <typename T> struct empty_ptr<T*> : std::unary_function<T*, void> { bool operator () (const T* x) const throw() { return x == NULL; } }; template <typename T> struct empty_ptr<T(*)[]> : std::unary_function<T*, void> { bool operator () (const T* x) const throw() { return x == NULL; } }; /*************************************************************************************************/ template<typename X, class Traits> class auto_ptr; template<typename X, class Traits> class auto_resource; /*! \defgroup ptr_traits ptr_traits \< ptrT \> \brief This sections defines requirements on classes representing <i>pointer traits</i>. The template class <code>ptr_traits\< ptrT \></code> is defined along with several specializations. A <i>pointer</i> may be any type used to refer to another, possibly not visible, type. In the following table, <code>X</code> denotes a Traits class defining types and functions for the pointer type PtrT. The type of the item refered to is T. T may be <code>void</code> or an incomplete type. The argument <code>p</code> is of type PtrT. <table> <tr> <td><b>expression</b></td> <td><b>return type</b></td> <td><b>notes</b></td> <td><b>complexity</b></td> </tr> <tr> <td><code>X::element_type</code></td> <td><code>T</code></td> <td>the type of the item refered to</td> <td>compile time</td> </tr> <tr> <td><code>X::pointer_type</code></td> <td><code>PtrT</code></td> <td>if opaque, may be any type used to refer to T</td> <td>compile time</td> </tr> <tr> <td><code>X::const_pointer_type</code></td> <td>implementation defined</td> <td>type corresponding to PtrT refering to a const T</td> <td>compile time</td> </tr> <tr> <td><code>X::is_array</code></td> <td><code>bool</code></td> <td>true iff T is an array; type may also be convertable to bool</td> <td>compile time</td> </tr> <tr> <td><code>X::delete_ptr(p)</code></td> <td><code>void</code></td> <td>destructs and deallocates item refered to by p; if p is empty, delete_ptr() has no effect</td> <td>implementation defined</td> </tr> <tr> <td><code>X::empty_ptr(p)</code></td> <td><code>bool</code></td> <td>result is <code>true</code> if <code>p</code> refers to nothing (corresponds to <code>NULL</code>); <code>false</code> otherwise</td> <td>constant</td> </tr> </table> */ /*@{*/ template <typename ptrT> struct ptr_traits; template <typename T> struct ptr_traits<T(*)[]> { typedef T element_type; typedef T* pointer_type; typedef const T* const_pointer_type; template <class U> struct rebind { typedef adobe::ptr_traits<U> other; }; enum { is_array = true }; static void delete_ptr(pointer_type x) throw() { adobe::delete_ptr<T(*)[]>()(x); } static bool empty_ptr(const_pointer_type x) throw() { return adobe::empty_ptr<T(*)[]>()(x); } }; /*! The ptr_traits class provide basic information and operations associated with a pointer type. */ template <typename T> struct ptr_traits<T*> { typedef T element_type; typedef T* pointer_type; typedef const pointer_type const_pointer_type; template <class U> struct rebind { typedef adobe::ptr_traits<U> other; }; enum { is_array = false }; static void delete_ptr(pointer_type x) throw() { adobe::delete_ptr<T*>()(x); } static bool empty_ptr(const_pointer_type x) throw() { return adobe::empty_ptr<T*>()(x); } template <typename lht> static lht runtime_cast (T* x) { return dynamic_cast<lht>(x); } }; template <typename T> struct ptr_traits<std::auto_ptr<T> > { typedef typename std::auto_ptr<T>::element_type element_type; typedef std::auto_ptr<T> pointer_type; typedef std::auto_ptr<const T> const_pointer_type; template <class U> struct rebind { typedef adobe::ptr_traits<U> other; }; enum { is_array = false }; template <typename lht> static lht runtime_cast (std::auto_ptr<T>& x) { typedef typename lht::element_type* dest_type; dest_type result = dynamic_cast<dest_type>(x.get()); if (result) x.release(); return lht(result); } }; template <typename T, class Traits> struct ptr_traits<adobe::auto_ptr<T, Traits> > { typedef typename adobe::auto_ptr<T, Traits>::element_type element_type; typedef adobe::auto_ptr<T, Traits> pointer_type; typedef adobe::auto_ptr<const T, Traits> const_pointer_type; enum { is_array = Traits::is_array }; template <typename lht> static lht runtime_cast (adobe::auto_ptr<T, Traits>& x) { typedef typename lht::element_type* dest_type; dest_type result = dynamic_cast<dest_type>(x.get()); if (result) x.release(); return lht(result); } }; template <typename T, class Traits> struct ptr_traits<adobe::auto_resource<T, Traits> > { typedef typename Traits::element_type element_type; typedef adobe::auto_resource<T, Traits> pointer_type; typedef adobe::auto_resource<const T, Traits> const_pointer_type; enum { is_array = Traits::is_array }; template <typename lht> static lht runtime_cast (adobe::auto_resource<T, Traits>& x) { typedef typename lht::element_type* dest_type; dest_type result = dynamic_cast<dest_type>(x.get()); if (result) x.release(); return lht(result); } }; /*@}*/ // group ptr_traits template <typename lht, typename rht> lht runtime_cast (rht rhs) { return ptr_traits<rht>::template runtime_cast<lht>(rhs); } /*************************************************************************************************/ #ifndef NO_DOCUMENTATION /* REVIST (sparent) : This could use boost::static_assert but it doesn't seem worth adding a boost dependency just for this case. */ namespace implementation { template <bool x> struct static_assert; template <> struct static_assert<true> { }; } #endif /*************************************************************************************************/ /*! \brief The template class <code>auto_resource\< X, Traits \></code> provides similar functionality to <code>auto_ptr</code> for resources for which the pointer is <i>opaque</i> refered to by a non-pointer type. <code>auto_ptr\< Item \></code> is equivalent to <code>auto_resource\< Item* \></code> with the addition of <code>operator *()</code> and <code>operator ->()</code>. <b>Example:</b> \dontinclude auto_resource_test.cpp \skip start_of_example \until end_of_example */ template <typename X, class Traits = adobe::ptr_traits<X> > class auto_resource { struct clear_type { }; struct dummy { void nonnull() { } }; typedef void (dummy::*safe_bool)(); protected: template <typename Y, class YTraits> struct auto_resource_ref; public: typedef Traits traits_type; typedef typename traits_type::element_type element_type; typedef typename traits_type::pointer_type pointer_type; // 20.4.5.1 construct/copy/destroy: explicit auto_resource(pointer_type p = 0) throw(); auto_resource(auto_resource&) throw(); template <typename Y> auto_resource(auto_resource<Y, typename traits_type::template rebind<Y>::other>&) throw(); auto_resource& operator = (auto_resource&) throw(); template<typename Y> auto_resource& operator = (auto_resource<Y, typename traits_type::template rebind<Y>::other>&) throw(); ~auto_resource() throw(); // construction and assignment from NULL auto_resource(clear_type*) throw(); auto_resource& operator = (clear_type*) throw(); // 20.4.5.2 members: pointer_type get() const throw(); pointer_type release() throw(); void reset(pointer_type p = 0) throw(); // 20.4.5.3 conversions: auto_resource(auto_resource_ref<X, Traits>) throw(); auto_resource& operator = (auto_resource_ref<X, Traits>) throw(); // addition template<typename Y> operator auto_resource_ref<Y, typename traits_type::template rebind<Y>::other>() throw(); template<typename Y> operator auto_resource<Y, typename traits_type::template rebind<Y>::other>() throw(); // Peter Dimov's safe_bool conversion operator safe_bool () const throw() { return pointer_m ? &dummy::nonnull : NULL; } bool operator!() const throw(); private: pointer_type pointer_m; }; /*************************************************************************************************/ /*! \brief The <code>adobe::auto_ptr\<\></code> template adds a number of extensions to <code>std::auto_ptr\<\></code>. Although <code>std::auto_ptr\<\></code> is a non-regular type, it has proven to be valueable especially when converting C or non-exception aware C++ to exception aware C++ code. It is also useful when dealing with C libraries (such as OS libraries) that by necisity return pointers. However, <code>std::auto_ptr\<\></code> has a number of limitations that make use error prone, limit when it can be used, and make it's use more combursome than necessary. The <code>adobe::auto_ptr\<\></code> includes the following not present in <code>std::auto_ptr\<\></code>: - The inclusion of ptr_traits to support alternative delete functions. - Proper support for array types. - Support for assignment from function results. - Safe bool casts. - Assignment and construction from NULL. Also, <code>adobe::auto_resource\<\></code> is provided for non-pointer and opaque pointer references. <b>Rationals:</b> Rational for not going with boost: scoped_ptr interface: The interface to boost:scoped_ptr is a constrained subset of auto_ptr with out any improvements. I'm not a fan of providing a whole new interface to prevent the user from performing some operations. Rational for traits instead of policies: - Advantages of policies - allows for per-instance state. - would allow for use with boost::function. - Disadvanteages - no real world examples to demonstrate the advantages. - complicates implementation to properly handle exceptions from throwing when assigning policies. - prohibits use of no-throw in declarations (may not be an actual disadvantage). - would require more complex interface for constructors. - would require swap be added to the interface to achieve a non-throwing swap and it is unclear how swap could be generally implemented. In total I thought the advantages didn't warrant the effort. If someone come demonstrate a concrete instance where there would be a strong advantage I'd reconsider. Differences between photoshop linear types and adobe:: types: - traits_type replaces deallocator and provides custom null checks - Safe bool casts. - Assignment and construction from NULL. - template based constructor, assignment, and conversion - linear_resource -> adobe::auto_resource - linear_base_ptr -> adobe::auto_ptr - linear_array<T> -> adobe::auto_ptr<T[]> - linear_ptr -> adobe::auto_ptr */ template<typename X, class Traits = adobe::ptr_traits<X*> > class auto_ptr : public auto_resource<X*, Traits> { typedef auto_resource<X*, Traits> inherited; struct clear_type { }; public: typedef Traits traits_type; typedef typename traits_type::element_type element_type; typedef typename traits_type::pointer_type pointer_type; typedef typename inherited::template auto_resource_ref<X*, Traits> auto_resource_ref_type; // 20.4.5.1 construct/copy/destroy: explicit auto_ptr(pointer_type p = 0) throw(); auto_ptr(auto_ptr& r) throw(); template <typename Y> auto_ptr(auto_ptr<Y, typename traits_type::template rebind<Y*>::other>& r) throw(); auto_ptr& operator = (auto_ptr&) throw(); template<typename Y> auto_ptr& operator = (auto_ptr<Y, typename traits_type::template rebind<Y*>::other>&) throw(); // construction and assignment from NULL auto_ptr(clear_type*) throw(); auto_ptr& operator = (clear_type*) throw(); // additions for interop with std::auto_ptr auto_ptr(std::auto_ptr<X>& r) throw(); template <typename Y> auto_ptr(std::auto_ptr<Y>& r) throw(); auto_ptr& operator = (std::auto_ptr<X>&) throw(); template<typename Y> auto_ptr& operator = (std::auto_ptr<Y>&) throw(); // 20.4.5.2 members: element_type& operator * () const throw(); pointer_type operator -> () const throw(); element_type& operator [] (std::size_t index) const throw(); // addition // 20.4.5.3 conversions: auto_ptr(auto_resource_ref_type r) throw(); auto_ptr& operator = (auto_resource_ref_type) throw(); // addition template<typename Y> operator auto_ptr<Y, typename traits_type::template rebind<Y*>::other>() throw(); }; /*************************************************************************************************/ template <typename X, class Traits> template <typename Y, class YTraits> struct auto_resource<X, Traits>::auto_resource_ref { Y pointer_m; }; /*************************************************************************************************/ template <typename X, class Traits> inline auto_resource<X, Traits>::auto_resource(pointer_type p) throw() : pointer_m(p) { } template <typename X, class Traits> inline auto_resource<X, Traits>::auto_resource(auto_resource& x) throw() : pointer_m(x.release()) { } template <typename X, class Traits> template <typename Y> inline auto_resource <X, Traits>::auto_resource(auto_resource<Y, typename traits_type::template rebind<Y>::other>& x) throw() : pointer_m(x.release()) { } template <typename X, class Traits> inline auto_resource<X, Traits>& auto_resource<X, Traits>::operator = (auto_resource& x) throw() { reset(x.release()); return *this; } template <typename X, class Traits> template <typename Y> inline auto_resource<X, Traits>& auto_resource<X, Traits>::operator = ( auto_resource<Y, typename traits_type::template rebind<Y>::other>& x) throw() { reset(x.release()); return *this; } template <typename X, class Traits> inline auto_resource<X, Traits>::~auto_resource() throw() { traits_type::delete_ptr(pointer_m); } /*************************************************************************************************/ template <typename X, class Traits> inline auto_resource<X, Traits>::auto_resource(clear_type*) throw() : pointer_m(NULL) { } template <typename X, class Traits> inline auto_resource<X, Traits>& auto_resource<X, Traits>::operator = (clear_type*) throw() { reset(); return *this; } /*************************************************************************************************/ template <typename X, class Traits> inline typename auto_resource<X, Traits>::pointer_type auto_resource<X, Traits>::get() const throw() { return pointer_m; } template <typename X, class Traits> inline typename auto_resource<X, Traits>::pointer_type auto_resource<X, Traits>::release() throw() { pointer_type result(pointer_m); pointer_m = NULL; return result; } template <typename X, class Traits> inline void auto_resource<X, Traits>::reset(pointer_type p) throw() { if (pointer_m != p) { traits_type::delete_ptr(pointer_m); pointer_m = p; } } /*************************************************************************************************/ template <typename X, class Traits> inline auto_resource<X, Traits>::auto_resource(auto_resource_ref<X, Traits> r) throw() : pointer_m(r.pointer_m) { } template <typename X, class Traits> inline auto_resource<X, Traits>& auto_resource<X, Traits>::operator = ( auto_resource_ref<X, Traits> r) throw() { reset(r.pointer_m); return *this; } template <typename X, class Traits> template<typename Y> inline auto_resource<X, Traits>::operator typename auto_resource<X, Traits>::template auto_resource_ref<Y, typename Traits::template rebind<Y>::other>() throw() { auto_resource_ref<Y, typename traits_type::template rebind<Y>::other> r; r.pointer_m = release(); return r; } template <typename X, class Traits> template<typename Y> inline auto_resource<X, Traits>::operator auto_resource<Y, typename Traits::template rebind<Y>::other>() throw() { return auto_resource<Y, typename traits_type::template rebind<Y>::other>(release()); } /*************************************************************************************************/ #if 0 /* REVISIT (sparent) : Under this version of gcc: Apple Computer, Inc. GCC version 1175, based on gcc version 3.1 20020420 (prerelease) I'm not able to get the following code to compile. The only way seems to be to inline it in the auto_resource class template. */ template <typename X, class Traits> inline auto_resource<X, Traits>::operator safe_bool () const throw() { return pointer_m ? &dummy::nonnull : NULL; } #endif template <typename X, class Traits> inline bool auto_resource<X, Traits>::operator!() const throw() { return !pointer_m; } /*************************************************************************************************/ template <typename X, class Traits> inline auto_ptr<X, Traits>::auto_ptr(pointer_type p) throw() : inherited(p) { } template <typename X, class Traits> inline auto_ptr<X, Traits>::auto_ptr(auto_ptr& r) throw() : inherited(r) { } template <typename X, class Traits> template <typename Y> inline auto_ptr<X, Traits>::auto_ptr(auto_ptr<Y, typename traits_type::template rebind<Y*>::other>& r) throw() : inherited(r) { } template <typename X, class Traits> inline auto_ptr<X, Traits>& auto_ptr<X, Traits>::operator = (auto_ptr& r) throw() { inherited::operator = (r); return *this; } template <typename X, class Traits> template<typename Y> inline auto_ptr<X, Traits>& auto_ptr<X, Traits>::operator = ( auto_ptr<Y, typename traits_type::template rebind<Y*>::other>& r) throw() { inherited::operator = (r); return *this; } /*************************************************************************************************/ template <typename X, class Traits> inline auto_ptr<X, Traits>::auto_ptr(clear_type*) throw() : inherited() { } template <typename X, class Traits> inline auto_ptr<X, Traits>& auto_ptr<X, Traits>::operator = (clear_type*) throw() { inherited::reset(); return *this; } /*************************************************************************************************/ template <typename X, class Traits> inline auto_ptr<X, Traits>::auto_ptr(std::auto_ptr<X>& r) throw() : inherited(r.release()) { } template <typename X, class Traits> template <typename Y> inline auto_ptr<X, Traits>::auto_ptr(std::auto_ptr<Y>& r) throw() : inherited(r.release()) { } template <typename X, class Traits> inline auto_ptr<X, Traits>& auto_ptr<X, Traits>::operator = (std::auto_ptr<X>& r) throw() { reset(r.release()); return *this; } template <typename X, class Traits> template<typename Y> inline auto_ptr<X, Traits>& auto_ptr<X, Traits>::operator = ( std::auto_ptr<Y>& r) throw() { reset(r.release()); return *this; } /*************************************************************************************************/ template <typename X, class Traits> inline typename auto_ptr<X, Traits>::element_type& auto_ptr<X, Traits>::operator * () const throw() { assert(!traits_type::empty_ptr(this->get())); return *this->get(); } template <typename X, class Traits> inline typename auto_ptr<X, Traits>::pointer_type auto_ptr<X, Traits>::operator -> () const throw() { assert(!traits_type::empty_ptr(this->get())); return this->get(); } template <typename X, class Traits> inline typename auto_ptr<X, Traits>::element_type& auto_ptr<X, Traits>::operator [] (std::size_t index) const throw() { adobe::implementation::static_assert<traits_type::is_array>(); assert(!traits_type::empty_ptr(this->get())); return *(this->get() + index); } /*************************************************************************************************/ template <typename X, class Traits> inline auto_ptr<X, Traits>::auto_ptr(auto_resource_ref_type r) throw() : inherited(r) { } template <typename X, class Traits> inline auto_ptr<X, Traits>& auto_ptr<X, Traits>::operator = ( auto_resource_ref_type r) throw() { inherited::operator = (r); return *this; } template <typename X, class Traits> template<typename Y> inline auto_ptr<X, Traits>::operator auto_ptr<Y, typename Traits::template rebind<Y*>::other>() throw() { return auto_ptr<Y, typename Traits::template rebind<Y*>::other>(inherited::release()); } /*************************************************************************************************/ } // namespace adobe /*************************************************************************************************/ #endif /*************************************************************************************************/ --- NEW FILE: iomanip.hpp --- /* Copyright 2005 Adobe Systems Incorporated Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt or a copy at http://opensource.adobe.com/licenses.html) */ /*************************************************************************************************/ #ifdef ADOBE_SERIALIZATION /*************************************************************************************************/ #ifndef ADOBE_IOMANIP_HPP #define ADOBE_IOMANIP_HPP /*************************************************************************************************/ #include <cassert> #include <iosfwd> #include <string> #include <sstream> #include <list> #include <stdexcept> #include <functional> #include <typeinfo> #include <adobe/future/iomanip_fwd.hpp> #include <adobe/future/manip.hpp> #include <adobe/name.hpp> #include <adobe/value.hpp> /*************************************************************************************************/ namespace adobe { /*************************************************************************************************/ namespace implementation { /*************************************************************************************************/ bool type_string(const std::type_info& t); bool type_float(const std::type_info& t); bool type_integer(const std::type_info& t); bool type_bool(const std::type_info& t); bool type_name(const std::type_info& t); /*************************************************************************************************/ } // namespace implementation /*************************************************************************************************/ extern const name_t bag_name_g; extern const name_t seq_name_g; extern const name_t alt_name_g; extern const name_t atom_name_g; /*************************************************************************************************/ class format_element_base { public: format_element_base(name_t tag = name_t()) : tag_m(tag) { } format_element_base(const format_element_base& rhs) : tag_m(rhs.tag_m) { } virtual ~format_element_base() { } virtual format_element_base* copy() { return new format_element_base(*this); } bool compare_tag(const name_t& tag) const { return tag_m == tag; } const char* tag() const { return tag_m.get(); } protected: name_t tag_m; }; /*************************************************************************************************/ class format_base { public: typedef std::ostream stream_type; typedef format_element_base* stack_element_type; typedef std::list<stack_element_type> stack_type; typedef std::list<stack_element_type>::iterator stack_iterator; typedef std::list<stack_element_type>::const_iterator stack_const_iterator; typedef std::list<stack_element_type>::const_reverse_iterator stack_const_riterator; virtual ~format_base() { clear_stack(); } virtual void begin_format(stream_type& os) { push_stack(os, new format_element_base()); } virtual void end_format(stream_type& os) { pop_stack(os); } virtual void begin_bag(stream_type& os, const std::string&) { push_stack(os, new format_element_base()); } virtual void end_bag(stream_type& os) { pop_stack(os); } virtual void begin_sequence(stream_type& os) { push_stack(os, new format_element_base()); } virtual void end_sequence(stream_type& os) { pop_stack(os); } virtual void begin_alternate(stream_type& os) { push_stack(os, new format_element_base()); } virtual void end_alternate(stream_type& os) { pop_stack(os); } virtual void begin_atom(stream_type& os, const std::type_info&) { push_stack(os, new format_element_base()); } virtual void end_atom(stream_type& os) { pop_stack(os); } format_base() : depth_m(0) { } format_base(const format_base& rhs) : depth_m(rhs.depth_m) { copy_stack(rhs.stack_m); } format_base& operator = (const format_base& rhs) { copy_stack(rhs.stack_m); return *this; } virtual std::size_t depth() { return depth_m; } virtual std::size_t stack_depth() { return stack_m.size(); } protected: void push_stack(stream_type& os, const stack_element_type& rhs) { push_stack_impl(rhs); stack_event(os, true); } void pop_stack(stream_type& os) { stack_event(os, false); pop_stack_impl(); } stack_element_type& stack_top() { return stack_n(0); } stack_element_type& stack_n(std::size_t n) { if (n > stack_m.size()) { std::stringstream buf; buf << "stack_n: n(" << n << ") > size(" << stack_m.size() << ")."; throw std::range_error(buf.str()); } stack_iterator i(stack_m.begin()); for (std::size_t count(0); count < n; ++count) ++i; return (*i); } #ifdef NDEBUG void assert_top_tag(const name_t&) { } #else void assert_top_tag(const name_t& tag) { assert(stack_top()->compare_tag(tag)); #if 0 if (!stack_top()->compare_tag(tag)) std::cerr << "WARNING: Tag mismatch! Got \'" << stack_top()->tag() << "\', was expecting \'" << tag << "\'\n"; #endif } #endif bool check_tag(std::size_t deep, const name_t& tag) { format_base::stack_element_type element(0); try { element = stack_n(deep); } catch (...) { return false; } return element ? element->compare_tag(tag) : false; } void up() { ++depth_m; } void down() { depth_m = std::max(std::size_t(0), --depth_m); } virtual void stack_event(stream_type& os, bool is_push) = 0; private: void push_stack_impl(const stack_element_type& rhs) { stack_m.push_front(rhs); } void pop_stack_impl() { if (stack_m.size() == 0) return; delete *stack_m.begin(); stack_m.pop_front(); } void copy_stack(const stack_type& rhs) { clear_stack(); for (stack_const_riterator i(rhs.rbegin()); i != rhs.rend(); ++i) push_stack_impl((*i)->copy()); } void clear_stack() { std::size_t count(stack_m.size()); for (std::size_t i(0); i < count; ++i) pop_stack_impl(); } std::size_t depth_m; // note: Visual "depth", NOT the depth of the stack stack_type stack_m; }; /*************************************************************************************************/ int format_base_idx(); format_base* get_formatter(std::ostream& os); /*************************************************************************************************/ format_base::stream_type& begin_format(format_base::stream_type& os); format_base::stream_type& end_format(format_base::stream_type& os); format_base::stream_type& end_bag(format_base::stream_type& os); format_base::stream_type& begin_sequence(format_base::stream_type& os); format_base::stream_type& end_sequence(format_base::stream_type& os); format_base::stream_type& begin_alternate(format_base::stream_type& os); format_base::stream_type& end_alternate(format_base::stream_type& os); format_base::stream_type& end_atom(format_base::stream_type& os); /*************************************************************************************************/ class indents : public basic_omanipulator<signed long, char, std::char_traits<char> > { typedef basic_omanipulator<signed long, char, std::char_traits<char> > inherited_t; public: typedef inherited_t::stream_type stream_type; typedef inherited_t::argument_type argument_type; indents(argument_type num) : inherited_t(indents::fct, num) { } inherited_t& operator() (argument_type i) { arg_m = std::max(i, argument_type(0)); return *this; } private: static stream_type& fct(stream_type& os, const argument_type& i) { for (argument_type count(0); count < i; ++count) os.put('\t'); return os; } }; /*************************************************************************************************/ class begin_bag : public basic_omanipulator<std::string, char, std::char_traits<char> > { typedef basic_omanipulator<std::string, char, std::char_traits<char> > inherited_t; public: typedef inherited_t::stream_type stream_type; typedef inherited_t::argument_type argument_type; begin_bag(argument_type index) : inherited_t(begin_bag::fct, index) { } inherited_t& operator() (argument_type /*i*/) { return *this; } private: static stream_type& fct(stream_type& os, const argument_type& i) { format_base* format(get_formatter(os)); if (format) format->begin_bag(os, i); return os; } }; /*************************************************************************************************/ class begin_atom : public manipulator_base { typedef manipulator_base inherited_t; public: typedef const std::type_info& argument_type; typedef std::basic_ostream<char, std::char_traits<char> > stream_type; begin_atom(argument_type typeinfo) : typeinfo_m(typeinfo) { } inherited_t& operator() (argument_type /*i*/) { return *this; } void do_manip(stream_type& strm) const { if (error_m != std::ios_base::goodbit) strm.setstate(error_m); else { std::ios_base::iostate err(error_m); try { fct(strm, typeinfo_m); } catch (...) { err = handle_error(strm); } if (err) strm.setstate(err); } } private: static stream_type& fct(stream_type& os, argument_type i) { format_base* format(get_formatter(os)); if (format) format->begin_atom(os, i); return os; } protected: argument_type typeinfo_m; }; /*************************************************************************************************/ template <class charT, class traits> std::basic_ostream<charT, traits>& operator << (std::basic_ostream<charT, traits>& os, const adobe::begin_atom& manip) { if (os.good()) mani... [truncated message content] |
|
From: Foster B. <fos...@us...> - 2005-04-18 21:15:55
|
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/documentation/sources/widget_lib In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/documentation/sources/widget_lib Added Files: widget_lib.dox widget_reference.dox Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: widget_lib.dox --- /*! \defgroup widget_lib Widget Library \ingroup asl_home */ --- NEW FILE: widget_reference.dox --- /*! \defgroup widget_reference Widget Reference \ingroup widget_lib \author Sean Parent, Adobe Systems Incorporated \author Foster Brereton, Adobe Systems Incorporated \date January 7, 2005 \section wr_widget_reference_abstract Abstract \par This document serves as a reference guide for the widgets one can define for the current implementation of Adobe Begin. \section wr_toc Table of Contents -# \ref wr_overview -# \ref wr_views_reference -# \ref wr_view_common_attributes -# \ref wr_view_classes -# bevel_button -# \ref wr_bevel_button "button_beveled" -# \ref wr_bevel_button "checkbox_beveled" -# \ref wr_bevel_button "radio_button_beveled" -# \ref wr_bevel_button "popup_beveled" -# \ref wr_button -# \ref wr_checkbox -# \ref wr_edit_number -# \ref wr_edit_text -# \ref wr_link -# \ref wr_popup -# \ref wr_progress_bar -# \ref wr_radio_button -# \ref wr_separator -# \ref wr_slider -# \ref wr_static_text -# \ref wr_containers_reference -# \ref wr_container_common_attributes -# \ref wr_container_classes -# Root-Level Containers -# \ref wr_dialog -# \ref wr_palette -# Nestable Containers -# \ref wr_column -# \ref wr_group -# \ref wr_overlay -# \ref wr_panel -# \ref wr_row -# \ref wr_tab_group \section wr_overview Widget Set Overview \par The widget set is best split into two categories: views and containers. \par A View is a "leaf node" widget like a button or a separator. A view cannot contain any views inside of it. Views define interface elements presented to the user. \par Containers are also views (and inherit all the attributes of a view), but can have subviews within themselves, including other containers. Containment denotes the layout relationships between subviews. Containers do not necessarily add interface elements to the dialog (though they can). \par There is also a set of root container classes. Only one root container is allowed per dialog, and it must be the topmost container in the defintion, otherwise the resulting dialog is undefined. \section wr_views_reference Views Reference \subsection wr_view_common_attributes Common View Attributes \par <table width='100%'> <tr> <th width="20%">attribute</th> <th width="20%">type</th> <th width="20%">default</th> <th>description</th> </tr> <tr> <td><code>indent</code></td> <td><code>number</code></td> <td><code>0</code></td> <td>Cross-stream indentation in pixels.</td> </tr> <tr> <td><code>horizontal</code></td> <td><code>alignment</code></td> <td><code>align_left</code></td> <td></td> </tr> <tr> <td><code>vertical</code></td> <td><code>alignment</code></td> <td><code>align_top</code></td> <td></td> </tr> <tr> <td><code>guide_mask</code></td> <td><code>array</code></td> <td><code>[ ]</code></td> <td>guides to suppress - current values are <code>guide_baseline</code>, <code>guide_label</code>.</td> </tr> <tr> <td><code>name</code></td> <td><code>string</code></td> <td><code>""</code></td> <td>displayed name of view</td> </tr> <tr> <td><code>bind</code></td> <td><code>name</code></td> <td><i>empty</i></td> <td>attached Adam cell</td> </tr> <tr> <td><code>bind_indirect</code></td> <td><code>name</code></td> <td><i>empty</i></td> <td>Adam cell containing the name of the Adam cell to attach</td> </tr> <tr> <td><code>touch</code></td> <td><code>array</code></td> <td>[ ]</td> <td>Adam cells to touch when set</td> </tr> <tr> <td><code>identifier</code></td> <td><code>name</code></td> <td><i>empty</i></td> <td>identifier for this widget</td> </tr> <tr> <td><code>size</code></td> <td>enumeration</td> <td><code>\@size_normal</code></td> <td>Valid values are one of <code>\@size_mini</code>, <code>\@size_small</code>, <code>\@size_normal</code>. Specifies the size of the text used for the widget.</td> </tr> <tr> <td><code>focus</code></td> <td><code>name</code></td> <td><i>empty</i></td> <td>attaches Adam cell to keyboard focus (identifier is value)</td> </tr> </table> \subsection wr_view_classes View Classes \subsubsection wr_bevel_button bevel_button \par The bevel button is a multi-use widget, and can emulate several other types of widgets. In fact, you cannot specify a <code>bevel_button</code> directly, but must invoke it as emulating another widget. The possible <code>bevel_button</code> variants are: - <code>button_beveled</code> - <code>checkbox_beveled</code> - <code>radio_button_beveled</code> - <code>popup_beveled</code> \par <table width='100%'> <tr> <th width="20%">attribute</th> <th width="20%">type</th> <th width="20%">default</th> <th>description</th> </tr> <tr> <td><code>name</code></td> <td><code>string</code></td> <td>""</td> <td>Name of the button</td> </tr> <tr> <td><code>value_on</code></td> <td><code>anything</code></td> <td><code>n/a</code></td> <td>Value to set the bound cell to when clicking the button in the off/neutral state. Useful when behaving as a radio button and checkbox.</td> </tr> <tr> <td><code>value_off</code></td> <td><code>anything</code></td> <td><code>n/a</code></td> <td>value to set the bound cell to when clicking the button in the on state. Useful when behaving as a radio button and checkbox.</td> </tr> <tr> <td><code>popup_bind</code></td> <td><code>name</code></td> <td><i>empty</i></td> <td>name of cell to which bevel button is bound. Useful when behaving as a popup.</td> </tr> <tr> <td><code>items</code></td> <td><code>array</code></td> <td><code>[ ]</code></td> <td>Specifies menu contents. Useful when behaving as a popup.</td> </tr> <tr> <td><code>items[]</code></td> <td><code>dictionary</code></td> <td><code>{ }</code></td> <td>Single menu item specification. Useful when behaving as a popup.</td> </tr> <tr> <td><code>items[].name</code></td> <td><code>string</code></td> <td>""</td> <td>Name of a given menu item. Useful when behaving as a popup.</td> </tr> <tr> <td><code>items[].value</code></td> <td><code>name</code></td> <td><i>empty</i></td> <td>Value to set the popup_bind cell to when this item is selected. Useful when behaving as a popup.</td> </tr> <tr> <td><code>popup_placement</code></td> <td><code>enumeration</code></td> <td><code>\@right</code></td> <td>Valid values are one of <code>\@right</code> or <code>\@down</code>. Arrow direction and menu location. Useful when behaving as a popup.</td> </tr> <tr> <td><code>bevel_thickness</code></td> <td><code>enumeration</code></td> <td><code>\@normal</code></td> <td>Valid values are one of <code>\@small</code>, <code>\@normal</code>, <code>\@large</code>, <code>\@rounded</code>. Specifies bevel button bevel style</td> </tr> </table> \subsubsection wr_button button \par <table width='100%'> <tr> <th width="20%">attribute</th> <th width="20%">type</th> <th width="20%">default</th> <th>description</th> </tr> <tr> <td><code>default</code></td> <td><code>boolean</code></td> <td><code>false</code></td> <td>set to true for default button behavior</td> </tr> <tr> <td><code>cancel</code></td> <td><code>boolean</code></td> <td><code>false</code></td> <td>set to true for cancel button behavior</td> </tr> <tr> <td><code>action</code></td> <td><code>enumeration</code></td> <td><i>required</i></td> <td>Valid values are one of <code>\@reset</code>, <code>\@cancel</code>, or <code>\@dialog</code>. Action for button to perform in the default state</td> </tr> <tr> <td><code>bind_output</code></td> <td><code>name</code></td> <td><i>empty</i></td> <td>If set, imposes value to the bound cell. <i>bind_output and action are mutually exclusive. If both are set for a widget then bind_output will take precedence.</i></td> </tr> <tr> <td><code>value</code></td> <td><code>string</code></td> <td>""</td> <td>When the action is <code>\@dialog</code>, specifies the name of the subdialog to open. When bind_output is set, it is the value imposed onto the cell.</td> </tr> <tr> <td><code>items</code></td> <td><code>array</code></td> <td><code>[ ]</code></td> <td>Specifies alternate namings of button based on modifier key states</td> </tr> <tr> <td><code>items[]</code></td> <td><code>dictionary</code></td> <td><code>{ }</code></td> <td>Alternate button state specification</td> </tr> <tr> <td><code>items[].name</code></td> <td><code>string</code></td> <td><code>""</code></td> <td>Name of button for given modifier key state</td> </tr> <tr> <td><code>items[].action</code></td> <td><code>enumeration</code></td> <td><i>required</i></td> <td>Valid values are one of <code>\@reset</code>, <code>\@cancel</code>, or <code>\@dialog</code>. Action button for given modifier key state</td> </tr> <tr> <td><code>items[].value</code></td> <td><code>string</code></td> <td><code>""</code></td> <td>When the action is <code>\@dialog</code> for this state, specifies the name of the subdialog to open</td> </tr> <tr> <td><code>items[].modifiers</code></td> <td><code>enumeration</code></td> <td><i>no modifiers</i></td> <td> Valid values are some name which is a combination of "opt", "ctl", "cmd" <i>in that order</i>. Specification of the button modifier keys that need to be held down for this state to be in effect. For example, <code>\@optctl</code> would set the state to this one when the option and control keys are pressed. Note that the order matters, so <code>\@optctl</code> is valid while <code>\@ctlopt</code> is not. </td> </tr> </table> \subsubsection wr_checkbox checkbox \par <table width='100%'> <tr> <th width="20%">attribute</th> <th width="20%">type</th> <th width="20%">default</th> <th>description</th> </tr> <tr> <td><code>value</code></td> <td><i>any</i></td> <td><i>required</i></td> <td>Value to impose upon the cell when the checkbox is clicked; also the value the cell must be set to in order for the checkbox to display selected. </td> </tr> <tr> <td><code>touch</code></td> <td><code>array of cell names</code></td> <td><code>[ ]</code></td> <td>When a checkbox is hit, specifies the other cells that should be made recently changed as well</td> </tr> </table> \subsubsection wr_edit_number edit_number \par <table width='100%'> <tr> <th width="20%">attribute</th> <th width="20%">type</th> <th width="20%">default</th> <th>description</th> </tr> <tr> <td><code>digits</code></td> <td><code>number</code></td> <td><code>5</code></td> <td>specifies width as approximate number of characters</td> </tr> <tr> <td><code>display_disable</code></td> <td><code>bool</code></td> <td><code>false</code></td> <td>When field is disabled, this will replace the edit text field with a static text field</td> </tr> <tr> <td><code>touch</code></td> <td><code>array of cell names</code></td> <td><code>[ ]</code></td> <td>When a field is modified, specifies the other cells that should be made recently changed as well</td> </tr> <tr> <td><code>format</code></td> <td><code>string</code> or <code>name</code></td> <td><code>"#.00"</code></td> <td>printf style format for Adam cell containing format</td> </tr> <tr> <td><code>units</code></td> <td><code>array</code></td> <td><code>[ ]</code></td> <td>Specifies unit popup contents</td> </tr> <tr> <td><code>units[]</code></td> <td><code>dictionary</code></td> <td><code>{ }</code></td> <td>Unit item specification</td> </tr> <tr> <td><code>units[].name</code></td> <td><code>string</code></td> <td>""</td> <td>Name of this popup menu item</td> </tr> <tr> <td><code>units[].bind</code></td> <td><code>name</code></td> <td><i>empty</i></td> <td>Name of cell to bind this popup item value to</td> </tr> <tr> <td><code>units[].format</code></td> <td><code>string</code></td> <td><code>"#.00"</code></td> <td>printf style format for cell value when this popup item is selected</td> </tr> <tr> <td><code>units[].scale</code></td> <td><code>array of two doubles</code></td> <td><code>array(1.0, 0)</code></td> <td> Scale factor for the popup item's value to the bound cell's proper units. This allows you to represent a given cell (say, <code>\@width_pixels</code>) in an arbitrary unit given a linear conversion. The linear formula is <code>y = a(x) + b</code>, so the default settings are simply <code>y = x</code>. As an example, if you cell is saving values in unit inches and you want to display your value in centimeters, the scale would be <code>array(2.54, 0.0)</code>. </td> </tr> </table> \subsubsection wr_edit_text edit_text \par <table width='100%'> <tr> <th width="20%">attribute</th> <th width="20%">type</th> <th width="20%">default</th> <th>description</th> </tr> <tr> <td><code>characters</code></td> <td><code>number</code></td> <td><code>10</code></td> <td>Specifies width as approximate number of characters (columns)</td> </tr> <tr> <td><code>lines</code></td> <td><code>int</code></td> <td><code>1</code></td> <td>Number of lines (rows) tall the edit text field should be</td> </tr> <tr> <td><code>monospaced</code></td> <td><code>bool</code></td> <td><code>false</code></td> <td>Specifies whether or not to use a monospaced 10-point font in this control</td> </tr> <tr> <td><code>scrollable</code></td> <td><code>bool</code></td> <td><code>false</code></td> <td>Specifies whether or not to attach horizontal and vertical scrollers to this text field.</td> </tr> </table> \subsubsection wr_link link \par <table width='100%'> <tr> <th width="20%">attribute</th> <th width="20%">type</th> <th width="20%">default</th> <th>description</th> </tr> <tr> <td><code>count</code></td> <td><code>number</code></td> <td><code>2</code></td> <td>number of prongs drawn in linkage</td> </tr> <tr> <td><code>value_on</code></td> <td><i>any</i></td> <td><i>n/a</i></td> <td>Value that must be set in cell for link to be displayed</td> </tr> <tr> <td><code>value_off</code></td> <td><i>any</i></td> <td><i>n/a</i></td> <td>Value to impose upon bound cell when the link is clicked on</td> </tr> </table> \subsubsection wr_popup popup \par <table width='100%'> <tr> <th width="20%">attribute</th> <th width="20%">type</th> <th width="20%">default</th> <th>description</th> </tr> <tr> <td><code>items</code></td> <td><code>array</code></td> <td><code>[ ]</code></td> <td>array of menu item elements</td> </tr> <tr> <td><code>items[]</code></td> <td><code>dictionary</code></td> <td><i>n/a</i></td> <td>menu item element</td> </tr> <tr> <td><code>items[].name</code></td> <td><code>string</code></td> <td><i>n/a</i></td> <td>name of menu item</td> </tr> <tr> <td><code>items[].value</code></td> <td><i>any</i></td> <td><i>n/a</i></td> <td>value of menu item</td> </tr> </table> \subsubsection wr_progress_bar progress_bar \par <table width='100%'> <tr> <th width="20%">attribute</th> <th width="20%">type</th> <th width="20%">default</th> <th>description</th> </tr> <tr> <td><code>format</code></td> <td><code>dictionary</code></td> <td><code>{ }</code></td> <td>Semantic specification of the progress bar</td> </tr> <tr> <td><code>format.first</code></td> <td><code>long</code></td> <td><code>0</code></td> <td>minimum value allowed</td> </tr> <tr> <td><code>format.last</code></td> <td><code>long</code></td> <td><code>100</code></td> <td>maximum value allowed</td> </tr> <tr> <td><code>format.interval</code></td> <td><code>long</code></td> <td><code>1</code></td> <td>Step value for increments between first and last</td> </tr> <tr> <td><code>is_indeterminate</code></td> <td><code>bool</code></td> <td><code>false</code></td> <td>Specifies an indeterminate (aka barber-pole) progress bar style</td> </tr> <tr> <td><code>is_relevance</code></td> <td><code>bool</code></td> <td><code>false</code></td> <td>Specifies an relevance bar style</td> </tr> <tr> <td><code>orientation</code></td> <td><code>identifier</code></td> <td><code>\@horizontal</code></td> <td>Could also be <code>\@vertical</code>. Specifies the direction of the progress bar.</td> </tr> </table> \subsubsection wr_radio_button radio_button \par <table width='100%'> <tr> <th width="20%">attribute</th> <th width="20%">type</th> <th width="20%">default</th> <th>description</th> </tr> <tr> <td><code>value</code></td> <td><i>any</i></td> <td><i>required</i></td> <td>Value to impose upon the cell when the button is clicked; also the value the cell must be set to in order for the button to display selected. </td> </tr> <tr> <td><code>touch</code></td> <td><code>array of cell names</code></td> <td><code>[ ]</code></td> <td>When a radio button is hit, specifies the other cells that should be made recently changed as well</td> </tr> </table> \subsubsection wr_separator separator \par <table width='100%'> <tr> <th width="20%">attribute</th> <th width="20%">type</th> <th width="20%">default</th> <th>description</th> </tr> <tr> <td><code>orientation</code></td> <td>enumeration</td> <td><code>\@horizontal</code></td> <td>(could also be <code>\@vertical</code>). Specifies the direction of the separator's growth. Alignment for that direction will be set to <code>align_fill</code>.</td> </tr> </table> \subsubsection wr_slider slider \par <table width='100%'> <tr> <th width="20%">attribute</th> <th width="20%">type</th> <th width="20%">default</th> <th>description</th> </tr> <tr> <td><code>format</code></td> <td><code>dictionary</code></td> <td><code>{ }</code></td> <td>Semantic specification of the slider</td> </tr> <tr> <td><code>format.first</code></td> <td><code>long</code></td> <td><code>0</code></td> <td>minimum value allowed</td> </tr> <tr> <td><code>format.last</code></td> <td><code>long</code></td> <td><code>100</code></td> <td>maximum value allowed</td> </tr> <tr> <td><code>format.interval</code></td> <td><code>long</code></td> <td><code>1</code></td> <td>Step value for increments between first and last</td> </tr> </table> \subsubsection wr_static_text static_text \par <table width='100%'> <tr> <th width="20%">attribute</th> <th width="20%">type</th> <th width="20%">default</th> <th>description</th> </tr> <tr> <td><code>wrap</code></td> <td><code>boolean</code></td> <td><code>false</code></td> <td>if true, text is wrapped to available space</td> </tr> </table> \section wr_containers_reference Containers Reference \subsection wr_container_common_attributes Common Container Attributes \par <table width='100%'> <tr> <th width="20%">attribute</th> <th width="20%">type</th> <th width="20%">default</th> <th>description</th> </tr> <tr> <td><code>placement</code></td> <td><code>placement</code></td> <td><code>place_column</code></td> <td></td> </tr> <tr> <td><code>child_horizontal</code></td> <td><code>alignment</code></td> <td><code>align_left</code></td> <td></td> </tr> <tr> <td><code>child_vertical</code></td> <td><code>alignment</code></td> <td><code>align_top</code></td> <td></td> </tr> <tr> <td><code>spacing</code></td> <td><code>number</code> or <code>array</code></td> <td><code>space_normal</code></td> <td></td> </tr> </table> \subsection wr_container_classes Container Classes \subsubsection wr_dialog dialog \par This is a root container class.\par <table width='100%'> <tr> <th width="20%">attribute</th> <th width="20%">type</th> <th width="20%">default</th> <th>description</th> </tr> <tr> <td><code>placement</code></td> <td><code>placement</code></td> <td><code>place_row</code></td> <td>different default than container</td> </tr> <tr> <td><code>metal</code></td> <td><code>bool</code></td> <td><code>false</code></td> <td>Allows for the metallic look on a dialog</td> </tr> <tr> <td><code>grow</code></td> <td><code>bool</code></td> <td><code>false</code></td> <td>allows for the dialog to be resized by the user</td> </tr> </table> \subsubsection wr_palette palette \par This is a root container class.\par <table width='100%'> <tr> <th width="20%">attribute</th> <th width="20%">type</th> <th width="20%">default</th> <th>description</th> </tr> <tr> <td><code>metal</code></td> <td><code>bool</code></td> <td><code>false</code></td> <td>Allows for the metallic look on a dialog</td> </tr> <tr> <td><code>grow</code></td> <td><code>bool</code></td> <td><code>false</code></td> <td>allows for the dialog to be resized by the user</td> </tr> </table> \subsubsection wr_column column \par <table width='100%'> <tr> <th width="20%">attribute</th> <th width="20%">type</th> <th width="20%">default</th> <th>description</th> </tr> <tr> <td><code>placement</code></td> <td><code>placement</code></td> <td><code>place_column</code></td> <td>a simple column container</td> </tr> </table> \subsubsection wr_group group \par <table width='100%'> <tr> <th width="20%">attribute</th> <th width="20%">type</th> <th width="20%">default</th> <th>description</th> </tr> <tr> <td><code>name</code></td> <td><code>string</code></td> <td>""</td> <td>Name of this group</td> </tr> </table> \subsubsection wr_overlay overlay \par <table width='100%'> <tr> <th width="20%">attribute</th> <th width="20%">type</th> <th width="20%">default</th> <th>description</th> </tr> <tr> <td><code>placement</code></td> <td><code>placement</code></td> <td><code>place_overlay</code></td> <td>a simple overlay container</td> </tr> <tr> <td><code>horizontal</code></td> <td><code>alignment</code></td> <td><code>align_fill</code></td> <td></td> </tr> <tr> <td><code>vertical</code></td> <td><code>alignment</code></td> <td><code>align_fill</code></td> <td></td> </tr> </table> \subsubsection wr_panel panel \par <table width='100%'> <tr> <th width="20%">attribute</th> <th width="20%">type</th> <th width="20%">default</th> <th>description</th> </tr> </table> \subsubsection wr_row row \par <table width='100%'> <tr> <th width="20%">attribute</th> <th width="20%">type</th> <th width="20%">default</th> <th>description</th> </tr> <tr> <td><code><i>placement</i></code></td> <td><code>placement</code></td> <td><code>place_row</code></td> <td>a simple row container</td> </tr> </table> \subsubsection wr_tab_group tab_group \par <table width='100%'> <tr> <th width="20%">attribute</th> <th width="20%">type</th> <th width="20%">default</th> <th>description</th> </tr> <tr> <td><code>items[]</code></td> <td><code>dictionary</code></td> <td><i>required</i></td> <td>tab specification</td> </tr> <tr> <td><code>items[].name</code></td> <td><code>string</code></td> <td><i>required</i></td> <td>name of the tab</td> </tr> <tr> <td><code>items[].value</code></td> <td><i>any</i></td> <td><i>n/a</i></td> <td>value of the tab</td> </tr> </table> */ |
|
From: Foster B. <fos...@us...> - 2005-04-18 21:15:54
|
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/documentation/sources/asl/related/images In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/documentation/sources/asl/related/images Added Files: adam_and_eve.jpg adam_mvc_design.jpg clippingpath.jpg codebase.jpg edit_text_example.jpg parameter_flow.jpg Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: adam_mvc_design.jpg --- (This appears to be a binary file; contents omitted.) --- NEW FILE: edit_text_example.jpg --- (This appears to be a binary file; contents omitted.) --- NEW FILE: clippingpath.jpg --- (This appears to be a binary file; contents omitted.) --- NEW FILE: adam_and_eve.jpg --- (This appears to be a binary file; contents omitted.) --- NEW FILE: parameter_flow.jpg --- (This appears to be a binary file; contents omitted.) --- NEW FILE: codebase.jpg --- (This appears to be a binary file; contents omitted.) |
|
From: Foster B. <fos...@us...> - 2005-04-18 21:15:54
|
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/documentation/sources/asl/images/originals In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/documentation/sources/asl/images/originals Added Files: calculate_data_t.graffle calculate_data_t_slice_t.graffle Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: calculate_data_t.graffle --- <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CanvasColor</key> <dict> <key>a</key> <string>1</string> <key>w</key> <string>1</string> </dict> <key>ColumnAlign</key> <integer>0</integer> <key>ColumnSpacing</key> <real>36</real> <key>GraphDocumentVersion</key> <integer>2</integer> <key>GraphicsList</key> <array> [...1187 lines suppressed...] koShm6KXgn////+GkoSZmQtOU0ZpcnN0UGFnZYaShKGbopcBhpKEmZkNTlNPcmllbnRh dGlvboaShKGbopcAhoaG </data> <key>RowAlign</key> <integer>0</integer> <key>RowSpacing</key> <real>36</real> <key>VPages</key> <integer>1</integer> <key>WindowInfo</key> <dict> <key>Frame</key> <string>{{52, 1}, {555, 797}}</string> <key>VisibleRegion</key> <string>{{0, 0}, {540, 704}}</string> <key>Zoom</key> <string>1</string> </dict> </dict> </plist> --- NEW FILE: calculate_data_t_slice_t.graffle --- <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CanvasColor</key> <dict> <key>a</key> <string>1</string> <key>w</key> <string>1</string> </dict> <key>ColumnAlign</key> <integer>0</integer> <key>ColumnSpacing</key> <real>36</real> <key>GraphDocumentVersion</key> <integer>2</integer> <key>GraphicsList</key> <array> [...1734 lines suppressed...] koShm6KXgn////+GkoSZmQtOU0ZpcnN0UGFnZYaShKGbopcBhpKEmZkNTlNPcmllbnRh dGlvboaShKGbopcAhoaG </data> <key>RowAlign</key> <integer>0</integer> <key>RowSpacing</key> <real>36</real> <key>VPages</key> <integer>1</integer> <key>WindowInfo</key> <dict> <key>Frame</key> <string>{{41, 35}, {555, 797}}</string> <key>VisibleRegion</key> <string>{{0, 0}, {540, 704}}</string> <key>Zoom</key> <string>1</string> </dict> </dict> </plist> |
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/documentation/sources/asl In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/documentation/sources/asl Added Files: adam.dox adam_evaluate.dox adam_parser.dox algorithm.dox array_t.dox circular_queue.dox conversion.dox copy_on_write.dox counter_t.dox defgroup_libraries.dox dictionary_t.dox empty_t.dox eve.dox eve_evaluate.dox eve_parser.dox final.dox forest.dox functional.dox istream.dox iterator.dox name_t.dox once.dox rectangle_t.dox static_table.dox string.dox table_index.dox typeinfo.dox value_t.dox virtual_machine_t.dox xstr.dox Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: adam_parser.dox --- //***************************************************************************// //***************************************************************************// //***************************************************************************// /*! \defgroup adamparser Adam Parser \ingroup asl_libraries */ /*! \fn void adobe::parse(std::istream& stream, const adobe::line_position_t& position, const adobe::adam_callback_suite_t& callbacks) \ingroup adamparser The Adam parsing function. \param stream The input stream to be parsed. \param position The starting line position. \param callbacks The callback suite used for client code communication. */ /*! \fn adobe::array_t adobe::parse_adam_expression(const std::string& expression) \ingroup adamparser Parses an Adam expression. \param expression The expression to be parsed in tokenized form. */ //***************************************************************************// //***************************************************************************// //***************************************************************************// /*! \class adobe::adam_callback_suite_t adam_parser.hpp <adobe/adam_parser.hpp> \ingroup adamparser \brief Callback class for the Adam parser. Client-defined callback function used by the Adam parser to communicate with the client code. The Adam parser will discover cell declarations and will signal callbacks herein of those declarations. */ /*! \typedef adobe::adam_callback_suite_t::add_cell_proc_t A callback function signature for a \ref concept_convertible_to_function that needs to be supplied. During the parsing of an Adam definition, the client will receive cell declaration notifications through this callback. \param type cell type declared in the defintion. \param cell_name name of the cell specified. \param position position in the parse of the declaration. \param expr_or_init array of tokens representing one of several things. \param brief trailing comment to this cell. \param detailed leading comment to this cell. */ /*! \typedef adobe::adam_callback_suite_t::add_interface_proc_t A callback function signature for a \ref concept_convertible_to_function that needs to be supplied. During the parsing of an Adam definition, the client will receive interface cell declaration notifications through this callback. \param cell_name name of the cell specified. \param linked specifies if the output cell is back-linked to the input cell. \param position1 position1 in the parse of the declaration. \param initializer array of tokens representing the input cell initializer. \param position2 position2 in the parse of the declaration. \param expression array of tokens representing the output cell relation expression. \param brief trailing comment to this cell. \param detailed leading comment to this cell. */ /*! \typedef adobe::adam_callback_suite_t::add_relation_proc_t A callback function signature for a \ref concept_convertible_to_function that needs to be supplied. During the parsing of an Adam definition, the client will receive relation declaration notifications through this callback. \param position position in the parse of the relation set declaration \param conditional tokenized expression array representing the optional conditional enabling this relation set. \param first first relation in the set. \param last one-past-the-last relation in the set. \param brief trailing comment to relation set. \param detailed leading comment to relation set. \sa \ref adobe::adam_callback_suite_t::relation_t for more information on the relation_t type. */ /*! \enum adobe::adam_callback_suite_t::cell_type_t Enumeration type denoting the kind of cell found in the parse. */ /*! \var adobe::adam_callback_suite_t::cell_type_t adobe::adam_callback_suite_t::input_k Specifies a linked input cell for the \c add_cell_proc_m callback routine. If this cell type is specified the expression in the array_t is the cell initializer. */ /*! \var adobe::adam_callback_suite_t::cell_type_t adobe::adam_callback_suite_t::output_k Specifies an output cell for the \c add_cell_proc_m callback routine. If this cell type is specified the expression in the array_t is the relation expression. */ /*! \var adobe::adam_callback_suite_t::cell_type_t adobe::adam_callback_suite_t::constant_k Specifies a constant cell for the \c add_cell_proc_m callback routine. If this cell type is specified the expression in the array_t is the cell initializer. */ /*! \var adobe::adam_callback_suite_t::cell_type_t adobe::adam_callback_suite_t::logic_k Specifies a logic cell for the \c add_cell_proc_m callback routine. If this cell type is specified the expression in the array_t is the relation expression. */ /*! \var adobe::adam_callback_suite_t::cell_type_t adobe::adam_callback_suite_t::invariant_k Specifies an invariant cell for the \c add_cell_proc_m callback routine. If this cell type is specified the expression in the array_t is the relation expression. */ //***************************************************************************// //***************************************************************************// //***************************************************************************// /*! \class adobe::adam_callback_suite_t::relation_t \ingroup adamparser \brief Struct containing details of a relation expression for client callbacks from the Adam parser. Every relation declared in an Adam expression is parsed and packed into this struct for the client code. */ /*! \var adobe::adam_callback_suite_t::relation_t::name_m Name of the cell being operated upon by this relation. */ /*! \var adobe::adam_callback_suite_t::relation_t::position_m Position in the parse of the relation declaration. */ /*! \var adobe::adam_callback_suite_t::relation_t::expression_m Tokenized expression array of the relation. */ /*! \var adobe::adam_callback_suite_t::relation_t::detailed_m Leading comment for the relation. */ /*! \var adobe::adam_callback_suite_t::relation_t::brief_m Trailing comment for the relation. */ --- NEW FILE: final.dox --- /*! \defgroup adobe_final Final \ingroup asl_libraries */ /*! \def ADOBE_FINAL \ingroup adobe_final \par A mixin class to ensure that a class cannot be derived from. The term "final" is a Java keyword, for which there is no C++ equivalent. \par See CUJ May 2001, Page 51 for more information. \par Credit to Shanker Chandrabose for the idea. \author <a href="mailto:da...@ad...">Doug Ahmann</a> \date 05/10/2001 - created \example \code class foo : ADOBE_FINAL { }; \endcode \example \code class bar { }; class foo : public bar, ADOBE_FINAL { }; \endcode */ --- NEW FILE: empty_t.dox --- /*! \class adobe::empty_t empty.hpp <adobe/empty.hpp> \ingroup asl_libraries \model_of - \ref concept_regular_type - \ref stldoc_LessThanComparable \brief An empty regular- and less-than-comparable- type. \rationale empty_t is useful for default values. For example, value_t() will construct a value_t containing an empty_t by default. */ --- NEW FILE: functional.dox --- /*! \defgroup adobe_functional Functional \ingroup asl_libraries */ /*! \class adobe::delete_ptr<T*> functional.hpp <adobe/functional.hpp> \ingroup adobe_functional \brief A function object for type \c T that invokes \c delete on a \c T*. adobe::delete_ptr is similar to boost::lambda::delete_ptr except it inhereits from std::unary_function so it can also be used with boost::bind. That requirement changes the interface so the pointer type must be provided in advance. This is as of boost 1.28. This functionality may be included in later releases of boost. */ /*! \class adobe::delete_ptr<T(*)[]> functional.hpp <adobe/functional.hpp> \ingroup adobe_functional \brief A function object for type \c T that invokes \c delete[] on an array of \c T. adobe::delete_ptr is similar to boost::lambda::delete_ptr except it inhereits from std::unary_function so it can also be used with boost::bind. That requirement changes the interface so the pointer type must be provided in advance. This is as of boost 1.28. This functionality may be included in later releases of boost. */ /*! \class adobe::constructor functional.hpp <adobe/functional.hpp> \ingroup adobe_functional \brief A function object for type \c T that constructs a new T with parameters. adobe::constructor is similar to boost::lambda::constructor except it defines \c result_type so it can also be used with \c boost::bind. This is as of boost 1.32.0. Also had to add the \c const \c A1 parameters to compile with CodeWarrior 9.3. */ /*! \class adobe::generator_t functional.hpp <adobe/functional.hpp> \ingroup adobe_functional \brief A function object for value generation within a domain. */ /*! \class adobe::sequence_t functional.hpp <adobe/functional.hpp> \ingroup adobe_functional \brief A function object for sequence generation within a domain. */ /*! \defgroup compare_members Object Member Comparsion \ingroup adobe_functional The library provides basic function object classes for comparing two member variables between object instances. */ /*! \class adobe::compare_members_t functional.hpp <adobe/functional.hpp> \ingroup compare_members \brief Utility class for adobe::compare_members. */ /*! \fn adobe::compare_members_t<T, R, std::less<R> > adobe::compare_members(R T::* member) \ingroup compare_members Used to compare members in two objects of type \c T using \c std::less<R>. \param member Name of the member to compare. \return An adobe::compare_members_t which can be used to make the comparison. */ /*! \fn adobe::compare_members_t<T, R, Compare> adobe::compare_members(R T::* member, Compare compare) \ingroup compare_members Used to compare members in two objects of type \c T using a provided comparsion function object. \param member Name of the member to compare. \param compare \ref concept_convertible_to_function object used for comparing the instance members. \return An adobe::compare_members_t which can be used to make the comparison. */ /*! \defgroup transform_member Object Member Transformation \ingroup adobe_functional The library provides basic function object classes for transforming a class instance into a member variable of that class. */ /*! \class adobe::transform_member_t functional.hpp <adobe/functional.hpp> \ingroup transform_member \brief Adaptor similar to \c boost::mem_fn() used by \c boost::bind. Unlike boost::mem_fn() this is of use when you want to use a pointer to a member and have it return a non-const reference. \todo (sparent) Propose this addition back to Boost. */ /*! \fn adobe::transform_member_t<T, R> adobe::make_transform(R T::* member) \ingroup transform_member Used to transform an object as a contained member variable. \param member Name of the member to which to transform. \return An adobe::transform_member_t which can be used to make the transformation. */ /*! \class adobe::indirect_t functional.hpp <adobe/functional.hpp> \ingroup adobe_functional \brief Adapter used to convert pointers to references. */ /*! \defgroup bitwise_operators Bitwise Operations \ingroup adobe_functional The library provides basic function object classes for all of the bitwise logical operators in the language. */ /*! \class adobe::bitwise_or functional.hpp <adobe/functional.hpp> \ingroup bitwise_operators \brief \c operator() returns <code>x | y</code>. */ /*! \class adobe::bitwise_and functional.hpp <adobe/functional.hpp> \ingroup bitwise_operators \brief \c operator() returns <code>x & y</code>. */ /*! \class adobe::bitwise_xor functional.hpp <adobe/functional.hpp> \ingroup bitwise_operators \brief \c operator() returns <code>x ^ y</code>. */ --- NEW FILE: eve_parser.dox --- /*! \defgroup eveparser Eve Parser \ingroup asl_libraries */ /*! \typedef adobe::eve::position_t \ingroup eveparser Client-defined type that contains relevant client-dependent information. Passed as a parameter to the assemble_t function to denote the parent of a node being created. */ /*! \typedef adobe::eve::assemble_t \ingroup eveparser Client-defined callback function used by the Eve parser to communicate with the client code. The Eve parser will discover view class declarations and will notify this callback of those declarations. \param parent The parent view's position_t of the view currently being created. \param parse_location The line position of the view currently being created. \param name The name of the view currently being created. \param parameters An expression which will evaluate to a dictionary_t containing the view attributes. \param brief The contents of the trailing comment (if any) after this view class declaration \param detailed The contents of the lead comment (if any) before this view class declaration \return The client callback should return an adobe::eve::position_t, which is a user-defined type that will be propagated to any immediate children of this view class declaration (if any). */ /*! \fn adobe::line_position_t adobe::eve::parse(std::istream& in, const adobe::line_position_t&, const adobe::eve::position_t&, const adobe::eve::assemble_t&) \ingroup eveparser The Eve parsing function. \param in The input stream to be parsed. \param line_position The starting line position. \param position The initial client-specific data to be used for the root view declaration(s). \param assembler The client-defined callback function to be called whenever a new view class declaration is encountered. \exception adobe::stream_error_t Thrown upon parsing failure. See documentation on adobe::stream_error_t for more information about this type. \return Stream position information regarding where the parse finished. */ --- NEW FILE: typeinfo.dox --- /*! \class adobe::bad_cast typeinfo.hpp <adobe/typeinfo.hpp> \ingroup asl_libraries \brief An exception class thrown during ASL failures to cast. <code>adobe::bad_cast</code> is a decendant of <code>std::exception</code>. It is intended to provide detailed type information regarding the parameters into a cast that failed. If no <code>typeid()</code> information was used to construct the object, it simply relays "bad_cast". */ /*! \fn adobe::bad_cast::bad_cast(const std::type_info& from, const std::type_info& to) \param from <code>typeid()</code> result for the source object. \param to <code>typeid()</code> result for the destination type. */ /*! \fn const char* adobe::bad_cast::what() const throw() \return Either: - The string "bad_cast" - A string detailing the source and destination types that could not be cast successfully. */ --- NEW FILE: array_t.dox --- /*! \class adobe::array_t array.hpp <adobe/array.hpp> \ingroup asl_libraries \brief A copy-on-write array of <code>adobe::value_t</code>. array_t is an array of heterogeneous types. array_t is copy-on-write, intended for usage where copies are frequent, but writing is infrequent. Constructing an empty array will never throw an exception - no allocations are required until something is stored into it. Likewise, copying with assignment or copy constructor will not throw. \model_of - \ref concept_regular_type \note When copy-on-write semantics are not important, it is advised to use <code>std::vector<adobe::value_t></code> or another container type instead of array_t. \note \anchor _1 [1] Because an array_t is copy-on-write, modifications through an iterator are not supported except via back_insert_iterator. \tutorial A tutorial for \ref asl_tutorials_array_t is available. */ /*! \typedef adobe::array_t::size_type An unsigned integral type. */ /*! \typedef adobe::array_t::difference_type A signed integral type. */ /*! \typedef adobe::array_t::value_type The type of object, <code>adobe::value_t</code>, stored in the <code>array_t</code>. */ /*! \typedef adobe::array_t::reference Reference to <code>adobe::value_t</code>. */ /*! \typedef adobe::array_t::const_reference Const reference to <code>adobe::value_t</code>. */ /*! \typedef adobe::array_t::pointer Pointer to <code>adobe::value_t</code>. */ /*! \typedef adobe::array_t::const_pointer Const pointer to <code>adobe::value_t</code>. */ /*! \typedef adobe::array_t::iterator A random access iterator for the array \ref _1 "[1]". */ /*! \typedef adobe::array_t::const_iterator Equivalent to <code>array_t::iterator</code>. */ /*! \typedef adobe::array_t::reverse_iterator A reverse iterator into the array \ref _1 "[1]". */ /*! \typedef adobe::array_t::const_reverse_iterator Equivalent to <code>array_t:: reverse_iterator</code>. */ /*! \fn adobe::array_t::array_t(size_type n, const value_t& item) Initializes the array_t with <code>n</code> items of value <code>item</code>. */ /*! \fn adobe::array_t::const_reference adobe::array_t::at(adobe::array_t::size_type index) const \param index The index at which the element to be referenced resides. \note Identical semantics to operator[](). \return A const_reference to the element specified. */ /*! \fn adobe::array_t::const_reference adobe::array_t::operator[](adobe::array_t::size_type index) const \param index The index at which the element to be referenced resides. \note Identical semantics to at(). \return A const_reference to the element specified. */ /*! \fn T adobe::array_t::get(adobe::array_t::size_type index) const \param index The index at which the element to be referenced resides. \return A copy of the element at the specified index. \exception std::exception Throws when the index is out-of-range. */ /*! \fn void adobe::array_t::get(adobe::array_t::size_type index, T& value) const \param index The index at which the element to be referenced resides. \param value Assigned the result if successful. Otherwise, <code>value</code> is untouched. \exception None. Guaranteed not to throw. */ /*! \fn adobe::array_t::const_reference adobe::array_t::front() const \return A const_reference to the first element in the array. */ /*! \fn adobe::array_t::const_reference adobe::array_t::back() const \return A const_reference to the last element in the array. Note this returns a different element than end(). */ /*! \fn adobe::array_t::write_reference adobe::array_t::write() \return A write_reference to the array. \note copy_on_write semantics mandate a copy of the internal implementation if it is being shared. */ /*! \fn adobe::array_t::array_t& adobe::array_t::set(adobe::array_t::size_type index, const T& value) \param index The index at which the element to be modified resides. \param value The value to which the element at <code>index</code> is assigned. \return A new array; a duplicate of this one with the new value set at index <code>index</code>. */ /*! \fn adobe::array_t::array_t& adobe::array_t::push_back(const T& value) \param value The value to be appended to the end of the array. \return A new array; a duplicate of this one with this value appended. */ /*! \fn bool adobe::array_t::empty() const \return <code>true</code> if the array is void of elements, <code>false</code> otherwise. */ /*! \fn adobe::array_t::size_type adobe::array_t::size() const \return A count of the number of elements in the array. */ /*! \fn adobe::array_t::size_type adobe::array_t::max_size() const \return Number of elements allowed to be added to the array before a memory reallocation is required. */ /*! \fn void adobe::array_t::resize(adobe::array_t::size_type n, const value_t& c) \param n Number of elements to resize the array to. \param c Value to which all new elements are initialized. */ /*! \fn void adobe::array_t::assign(adobe::array_t::size_type n, const value_t& c) \todo (fbrereto) Detail parameters */ /*! \fn size_type adobe::array_t::erase(adobe::array_t::size_type x) \param x index of the element to be removed. \todo (fbrereto) Detail return */ /*! \fn void adobe::array_t::pop_back() Erases the last element in the array. */ /*! \fn void adobe::array_t::clear() Resets the array's internals to a default state. \note This will not guarantee destruction of the elements formerly contained within the array, as other arrays may also be referring to them. */ /*! \fn adobe::array_t::const_iterator adobe::array_t::begin() const \return An iterator to the first element in the array */ /*! \fn adobe::array_t::const_iterator adobe::array_t::end() const \return An iterator to one past the last element in the array */ /*! \fn adobe::array_t::const_reverse_iterator adobe::array_t::rbegin() const \return An iterator to one past the last element in the array */ /*! \fn adobe::array_t::const_reverse_iterator adobe::array_t::rend() const \return An iterator to the first element in the array */ /*! \fn adobe::array_t::back_insert_iterator adobe::array_t::back_inserter() \return An insert iterator into the array allowing for backside appending of new elements. */ /*! \fn bool adobe::array_t::identity(const array_t& x) const \param x Array to compare this array against. \return <code>true</code> if this array and the argument refer to the same copy_on_write instance; <code>false</code> otherwise. \note This is not the same as <code>operator==</code>. This function will return <code>false</code> if the arrays are identical but do not refer to the same implementation instance. */ /*! \fn bool adobe::array_t::unique_instance() const \return <code>true</code> if this array is the only one referrring to its implementation instance (i.e., the implementation instance is currently not being shared). <code>false</code> otherwise. */ /*! \class adobe::array_t::back_insert_iterator array.hpp <adobe/array.hpp> \ingroup asl_libraries \brief a back insert iterator for appending to array_t. Assignment through a <code>back_insert_iterator</code> will insert an object after the last element of an <code>array_t</code>. \model_of - \ref output_iterator */ --- NEW FILE: adam_evaluate.dox --- //***************************************************************************// //***************************************************************************// //***************************************************************************// /*! \fn adobe::adam_callback_suite_t adobe::bind_to_sheet(adobe::sheet_t&) \ingroup adamparser \param sheet the sheet to be bound to this parse of an adam file \return A callback suite for the parser to communicate to the sheet */ --- NEW FILE: value_t.dox --- /*! \class adobe::value_t value.hpp <adobe/value.hpp> \ingroup asl_libraries \brief A descriminated type for single values. \model_of - \ref concept_regular_type \details \par Type Promotion \c adobe::value_t leverages <code>adobe::promote</code> while storing instance values. This is an exception to the discriminating union concept to which \c adobe::value_t adheres. \par Getting a Value \c adobe::value_t uses <code>get<>()</code> to get its instance value. It behaves like an explicit cast and an assignment: getting a value_t out will always succeed and simply returns the same value_t. \par Setting a Value \c adobe::value_t uses <code>set<>()</code> to set its instance value. It behaves like an explicit cast and an assignment: putting a value_t into a value_t simply assigns the values; it does not wrap them. \par How does adobe::value_t differ from boost::any? value_t differs from <a href="http://www.boost.org/doc/html/any.html"><code>boost::any</code></a> in several ways: - value_t models \ref stldoc_EqualityComparable, fully modeling a \ref concept_regular_type. - value_t supports type promotion. See <code>adobe::promote</code> for more details. - get<>() results are returned by reference, making value_t generally more efficient. \tutorial A tutorial for \ref asl_tutorials_value_t is available. */ /*! \fn adobe::value_t::value_t(const T& x) \param x Value to copy as the instance value of this object. \note What is stored is a copy of <code>x</code> promoted to <code>promote<T>::type</code>. */ /*! \fn const typename promote<T>::type& adobe::value_t::get() const \return A refernce to a promoted type for <code>T</code> containing the <code>value_t</code>'s instance value. \exception adobe::bad_cast Thrown if <code>adobe::promote<T></code> does not match the stored instance type. */ /*! \fn typename promote<T>::type& adobe::value_t::get() \return A refernce to a promoted type for <code>T</code> containing the <code>value_t</code>'s instance value. \exception adobe::bad_cast Thrown if <code>adobe::promote<T></code> does not match the stored instance type. */ /*! \fn bool adobe::value_t::get(T& x) const \param x Value that will be set to the value stored in the value_t. \return <code>true</code> if x was set successfully, <code>false</code> otherwise. \exception Undefined Will relay anything thrown by <code>x.operator=()</code>. */ /*! \fn adobe::value_t& adobe::value_t::set(const T& x) \param x The new value to assign to this value_t. \return The value_t with its new value set. */ /*! \fn const std::type_info& adobe::value_t::type() const \return The information returned by <code>typeid()</code> for the instance value. */ /*! \class adobe::value_t::transform value.hpp <adobe/value.hpp> \ingroup asl_libraries \brief Function object used in binding for instance value access. */ /*! \typedef adobe::value_t::transform::result_type The promoted value type from T that will be returned by this function object's <code>operator()</code>s. */ /*! \typedef adobe::value_t::transform::argument_type Parameter type required by this function object's <code>operator()</code>s. */ /*! \fn promote<T>::type& adobe::value_t::transform::operator()(value_t &x) const \param x The value from which the result is to be obtained. \return A reference to the instance value stored in this value_t. */ /*! \fn const promote<T>::type& adobe::value_t::transform::operator()(const value_t &x) const \param x The value from which the result is to be obtained. \return A reference to the instance value stored in this value_t. */ --- NEW FILE: copy_on_write.dox --- //***************************************************************************// //***************************************************************************// //***************************************************************************// /*! \class adobe::copy_on_write copy_on_write.hpp <adobe/copy_on_write.hpp> \ingroup asl_libraries \brief A wrapper class enabling copy on write semantics for a type. \model_of - \ref concept_regular_type \rationale Copy on write semantics treat an object such that a copying becomes "lazy", that is, a copy of an object will only take place when absolutely necessary. This happens whenever the value is written to, hence the name "copy on write". Internally the object stores a reference count to a commonly shared element, and copies the element off at write time. If there is only one copy_on_write object referencing that element, no copies are made at write time. \note The copy_on_write class is thread safe when compiled with BOOST_HAS_THREADS defined. */ /*! \typedef adobe::copy_on_write::value_type \brief A typedef of the type T used as the underlying value type of this object. */ /*! \fn adobe::copy_on_write::copy_on_write(const value_type& x) \brief Constructs a new copy_on_write object with a value <code>x</code>. \param x A default value to assign to this object */ /*! \fn adobe::copy_on_write::copy_on_write(const copy_on_write& x) \brief Constructs a new copy_on_write object using another copy_on_write object as its value. \param x Right hand side element to duplicate */ /*! \fn value_type& adobe::copy_on_write::write() \brief Obtain a reference to the object the object is referencing. This will copy the underlying value (if necessary) so changes to the value do not affect other copy_on_write objects. \return A reference to the underlying object */ /*! \fn adobe::copy_on_write::operator const value_type&() const \brief Obtain a reference to the underlying object. \return A reference to the underlying object */ /*! \fn const value_type& adobe::copy_on_write::operator*() const \brief Obtain a reference to the underlying object. This is provided because you cannot override <code>operator . ()</code>. It allows copy_on_write to be used with common transformation techniques, such as boost <code>indirect_iterator</code> and <code>transform_iterator</code>. It does not imply "pointer" semantics. \return A reference to the underlying object */ /*! \fn const value_type* adobe::copy_on_write::operator->() const \brief Obtain a pointer to the underlying object. This is provided because you cannot override <code>operator . ()</code>. It allows copy_on_write to be used with common transformation techniques, such as boost <code>indirect_iterator</code> and <code>transform_iterator</code>. It does not imply "pointer" semantics. \return A pointer to the underlying object */ /*! \fn bool adobe::copy_on_write::unique_instance() const \brief unique_instance returns whether or not the reference count to the object instance is one. This is useful if you want to determine if writing will cause a copy. \return Boolean; <code>true</code> if the ref count for the instance is one. */ /*! \fn bool adobe::copy_on_write::identity(const copy_on_write< T > &x) const \brief identity is used to see if two copy_on_write items refer to the same instance. \return Boolean; <code>true</code> if the underlying object instance is shared by both objects. */ /*! \fn adobe::copy_on_write& adobe::copy_on_write::operator=(const adobe::copy_on_write& x) \return a reference to this object. */ --- NEW FILE: eve.dox --- /*! \defgroup eve_engine Eve \ingroup asl_libraries */ //***************************************************************************// //***************************************************************************// //***************************************************************************// /*! \class adobe::eve_t eve.hpp <adobe/eve.hpp> \ingroup eve_engine \brief Eve engine. */ /*! \typedef adobe::eve_t::debug_frame_proc_t \ref concept_convertible_to_function type used for debugging eve layouts. \sa \ref adobe::eve_t::set_debug_frame_proc() \sa \ref adobe::eve_t::do_framing() */ /*! \enum adobe::eve_t::alignment_t Specifies the alignment of a view along the horizontal or vertical axis relative to its parent view. \note Locale support for direction is not implemented yet. */ /*! \var adobe::eve_t::alignment_t adobe::eve_t::align_default (Horizontal and vertical) default alignment. */ /*! \var adobe::eve_t::alignment_t adobe::eve_t::align_forward (Horizontal and vertical) aligned in-order relative to current locale settings. */ /*! \var adobe::eve_t::alignment_t adobe::eve_t::align_reverse (Horizontal and vertical) aligned in reverse order relative to current locale settings. */ /*! \var adobe::eve_t::alignment_t adobe::eve_t::align_center (Horizontal and vertical) aligned centered. */ /*! \var adobe::eve_t::alignment_t adobe::eve_t::align_proportional (Horizontal and vertical) extra space in the parent container's layout is distributed evenly among those with this alignment. */ /*! \var adobe::eve_t::alignment_t adobe::eve_t::align_fill (Horizontal and vertical) the dimensions of this view are expanded to consume all extra space on either side of this view. */ /*! \var adobe::eve_t::alignment_t adobe::eve_t::align_left (Horizontal) left-alignment. Changes with the current locale. */ /*! \var adobe::eve_t::alignment_t adobe::eve_t::align_right (Horizontal) right-alignment. Changes with the current locale. */ /*! \var adobe::eve_t::alignment_t adobe::eve_t::align_top (Vertical) top-alignment. Changes with the current locale. */ /*! \var adobe::eve_t::alignment_t adobe::eve_t::align_bottom (Vertical) bottom-alignment. Changes with the current locale. */ /*! \enum adobe::eve_t::placement_t Specifies the placement of child views inside their containing view. */ /*! \var adobe::eve_t::placement_t adobe::eve_t::place_leaf This view is a leaf node and has no children. */ /*! \var adobe::eve_t::placement_t adobe::eve_t::place_column Children are to be stacked in a column in the parent view. */ /*! \var adobe::eve_t::placement_t adobe::eve_t::place_row Children are to be lined up in a row in the parent view. */ /*! \var adobe::eve_t::placement_t adobe::eve_t::place_overlay Intended for use when two or more widgets are to occupy the same screen real estate at mutually exclusive times. In this instance the immediate children of the parent whose placement is set to overlay have their vertical and horizontal alignments set to align_fill. */ /*! \var adobe::eve_t::placement_t adobe::eve_t::place_row_forced_left_to_right Forces alignement of the children views from left to right. Locale independent. \todo (sparent) : Unimplemented */ /*! \enum adobe::eve_t::evaluate_options_t Specifies the coordinate system origin for the place_data_t of a given view. */ /*! \var adobe::eve_t::evaluate_options_t adobe::eve_t::evaluate_nested Specifies the origin of the coordinate system to be the top left point of the parent view. */ /*! \var adobe::eve_t::evaluate_options_t adobe::eve_t::evaluate_flat Specifies the origin of the coordinate system to be the top left point of the topmost view in the hierarchy. */ /*! \fn adobe::eve_t::iterator adobe::eve_t::add_view_element(const adobe::eve_t::iterator& parent, const adobe::eve_t::insert_element_t& element) \par Adds a new view element to the view hierarchy being formed for layout. \param parent the parent of this view. Specify a default-constructed adobe::eve_t::iterator if this view is to be the topmost view. There can only be <i>one</i> topmost view when Eve goes to solve for the layout. \param element details on the element being appended at this node, including callbacks specific to this node that will be used when Eve wants to communicate with the client regarding this specific view. \return An opaque adobe::eve_t::iterator, which can be used as the <code>parent</code> parameter in another call to add_view_element to place subviews inside this one. */ /*! \fn void adobe::eve_t::evaluate(adobe::eve_t::evaluate_options_t options) \par Hands the constructed view tree over to the Eve engine to solve for the layout. All elements should be added (with add_view_element) before this call is invoked. \param options options to be passed to the solution engine. \sa \ref adobe::eve_t::evaluate_options_t */ /*! \fn void adobe::eve_t::adjust(long width, long height, adobe::eve_t::evaluate_options_t options) \par Adjusts the solved view layout to fit within the nely specified dimensions. Eve will relay the new solved layout information to individual widgets through thier place() callbacks. \param width the new width for the view layout. \param height the new height for the view layout. \param options options to be passed to the solution engine. \sa \ref adobe::eve_t::evaluate_options_t */ /*! \fn void adobe::eve_t::set_debug_frame_proc(const adobe::eve_t::debug_frame_proc_t& proc) \par This function is one of two for debugging purposes. Only one callback function is retained per Eve instance, and can be overwritten any time. \param proc the callback function Eve will notify of the widget boundaries it calculated. */ /*! \fn void adobe::eve_t::do_framing() \par This function is the second of two for debugging purposes. After the layout of a view has been calculated completely, a client of the Eve engine can set a framing callback with set_debug_frame_proc, then have Eve notify that proc with this function call. Each widget's placement data will be send to the callback specified. \par One very practical use for this function in debugging is drawing the boundaries on the screen directly over the human interface. This will reveal misalignments between where the widgets laid out versus where Eve placed them ideally. */ //***************************************************************************// //***************************************************************************// //***************************************************************************// /*! \class adobe::eve_t::insert_element_t eve.hpp <adobe/eve.hpp> \ingroup eve_engine \brief Data type for detailing view node insertion into the engine. */ /*! \var adobe::eve_t::insert_element_t::is_container_type_m Specifies whether or not the new node is to be a container view or not, irrespective of whether or not it will actually contain subviews. */ /*! \var adobe::eve_t::insert_element_t::parameters_m Specifies default parameters by which the view is to be initialized. \par Available Parameter Keys <table width="100%" border="1"> <tr><th>Name</th><th>Possible Values</th><th>Default</th><th>Notes</th></tr> <tr> <td><code>child_horizontal</code></td> <td>Any of the adobe::eve_t::alignment_t enumeration labels as an adobe::name_t</td> <td><code>align_default</code></td> <td></td> </tr> <tr> <td><code>child_vertical</code></td> <td>Any of the adobe::eve_t::alignment_t enumeration labels as an adobe::name_t</td> <td><code>align_default</code></td> <td></td> </tr> <tr> <td><code>guide_mask</code></td> <td>array containing any of [ guide_baseline, guide_label ]</td> <td>empty (no suppression)</td> <td>Suppression of horizontal and/or vertical guides</td> </tr> <tr> <td><code>horizontal</code></td> <td>Any of the adobe::eve_t::alignment_t enumeration labels as an adobe::name_t</td> <td><code>align_default</code></td> <td></td> </tr> <tr> <td><code>indent</code></td> <td>integer</td> <td>0</td> <td></td> </tr> <tr> <td><code>placement</code></td> <td>Any of the adobe::eve_t::placement_t enumeration labels as an adobe::name_t</td> <td><code>place_leaf</code></td> <td></td> </tr> <tr> <td><code>spacing</code></td> <td>array of integers</td> <td><code>[ 0 ]</code></td> <td>A single value here will propagate for all needed spacing values</td> </tr> <tr> <td><code>vertical</code></td> <td>Any of the adobe::eve_t::alignment_t enumeration labels as an adobe::name_t</td> <td><code>align_default</code></td> <td></td> </tr> </table> */ /*! \var adobe::eve_t::insert_element_t::signals_m Specifies a suite of \ref concept_convertible_to_function callbacks Eve will use to communicate with the client. \sa \ref adobe::eve_t::signal_suite_t */ //***************************************************************************// //***************************************************************************// //***************************************************************************// /*! \class adobe::eve_t::calculate_data_t eve.hpp <adobe/eve.hpp> \ingroup eve_engine \brief Eve data interface from the client to the engine. \par \image html calculate_data_t.jpg calculate_data_t slice-independent widget geometry \todo (sparent) : We have a mechanism for defaulting container attributes. This needs to be extended to view attributes such as supressing guides. */ /*! \var adobe::eve_t::calculate_data_t::spacing_m \par spacing is the amount of space <i>between children</i>. Because the spacing vector is used to determine spacing between children, for a container with <code>N</code> children only the first <code>N-1</code> spacing values will be used. If the spacing vector has a single element, that value is used for all spacing between all children. This only applies to container widgets. */ /*! \var adobe::eve_t::calculate_data_t::placement_m \par placement is the enumeration denoting the orientation children will have with respect to one another when being laid out. \sa \ref adobe::eve_t::placement_t */ /*! \var adobe::eve_t::calculate_data_t::slice_m \par This array contains the orientation-specific geometry for the widget in the two relative orientations (horiztonal and vertical). \sa \ref adobe::eve_t::calculate_data_t::slice_t */ /*! \var adobe::eve_t::calculate_data_t::indent_m \par indent is a cross-stream value denoting the amount of indent for this single value. Cross-stream means that it is a value perpendicular to the orientation of the slice in which it is defined. Therefore, the horizontal indent is the amount in which the widget will be moved down vertically inside its parent. */ /*! \var adobe::eve_t::calculate_data_t::create_m \par create is a boolean denoting whether or not this widget will actually exist as a UI framework. If <code>false</code>, this widget's geometry will affect the view layout but will not send a <code>place</code> call through the widget signal suite. Noncreating views such as <code>row</code> and <code>column</code> are good examples of widget types whose <code>create_m</code> is <code>false</code>. \sa \ref adobe::eve_t::signal_suite_t */ //***************************************************************************// //***************************************************************************// //***************************************************************************// /*! \class adobe::eve_t::calculate_data_t::slice_t eve.hpp <adobe/eve.hpp> \ingroup eve_engine \brief Widget geometry for a single orientation of eve_t::calculate_data_t. \par \image html calculate_data_t_slice_t.jpg calculate_data_t::slice_t widget geometry for the horizontal orientation \par The above is a diagram detailing a widget's geometry for a the horizontal orientation. The vertical orientation is similar but runs top-to-bottom instead of left-to-right. */ /*! \var adobe::eve_t::calculate_data_t::slice_t::length_m \par length is the "active content" of the widget, and is also the space in which child widgets are allowed. In a container this the minimum allowable size of the container- Eve will then grow the container to contain its children if need be. Therefore, the typical value for this variable for a container is zero. */ /*! \var adobe::eve_t::calculate_data_t::slice_t::outset_m \par outset is a pair of values- one for either end of the slice. An outset represents an outer boundary of space taken up graphically by the widget, but is not considered when the functionality of the widget is concerned. The outset is bounded on the inside by the outside of the widget frame. An example of something defined by an outset would be a drop shadow. Outsets are allowed to bleed into the whitespace of the owning view (insets and spacings, but <i>not</i> margins), and if any outsets are left over they propagate to the parent view. */ /*! \var adobe::eve_t::calculate_data_t::slice_t::inset_m \par inset is a pair of values- one for either end of the slice. An inset represents an inner boundary of space taken up graphically by the widget, but is not considered when the functionality of the widget is concerned. An inset is bounded on the outside by the inside of the widget frame. An (seemingly nonsensical) example of something defined by the inset would be a drop shadow internal to the bounds of the window. \note inset is not implemented yet. */ /*! \var adobe::eve_t::calculate_data_t::slice_t::frame_m \par frame is a pair of values- one for either end of the slice. A frame represents a border around the widget. An example of such would be the grow-frame around a typical window in the Windows operating system. A frame is surrounded by the outset of the widget on the outside and the inset of the widget on the inside. */ /*! \var adobe::eve_t::calculate_data_t::slice_t::margin_m \par margin is a pair of values- one for either end of the slice. A margin represents a border around the children of this widget. Thus, this value only applies to container widgets. Margins are similar to insets except they cannot be "bled into" by subchildren outsets. */ /*! \var adobe::eve_t::calculate_data_t::slice_t::alignment_m \par alignment specifies the relationship of this widget to its parent along this orientation. \sa \ref adobe::eve_t::alignment_t */ /*! \var adobe::eve_t::calculate_data_t::slice_t::child_alignment_m \par child_alignment attempts to specify the alignment of the children contained inside this widget for this orientation. This alignment value will be applied to all immediate children of this widget who have no overriding alignment value of their own (that is, their alignment is <code>align_default</code>). \sa \ref adobe::eve_t::alignment_t */ /*! \var adobe::eve_t::calculate_data_t::slice_t::guides_m \par guides are a vector of values relaying internal "points of interest" from the widget to the Eve engine so that these points in other widgets may "snap" into co-alignment. An example of something using guides would be colon-alignment (horizontal case) or baseline-alignment (vertical case). Note that the guides in a slice affect the position of the widget along the other orientation: to specify a horizontal guide point is to allow the widget to be shifted vertically to align with other horizontal guide points. */ /*! \var adobe::eve_t::calculate_data_t::slice_t::suppress_m \par suppress handles the propagation of guide points from the children in this widget to the parent of this widget. If suppress is <code>true</code> then guides are "clipped" at this widget and the parent of this widget does not see guide point information about any of the children contained within. \todo (sparent) Currently only implemented cross stream */ //***************************************************************************// //***************************************************************************// //***************************************************************************// /*! \class adobe::eve_t::place_data_t eve.hpp <adobe/eve.hpp> \ingroup eve_engine \brief Eve data interface from the engine to the client. \par The place_data_t is the primary communication mechanism Eve uses to get solved layout information to the client. The place_data_t is similar to the calculate_data_t, except for the following: - data included is the "solved" result, not the data the client passed in (though the solution is based on the client's data) - data included is only pertinent to the laying-out of the widget into it's final resting place. \par This struct is used when calling the place signal inside the widget's related place signal. \sa \ref adobe::eve_t::signal_suite_t */ //***************************************************************************// //***************************************************************************// //***************************************************************************// /*! \class adobe::eve_t::place_data_t::slice_t eve.hpp <adobe/eve.hpp> \ingroup eve_engine \brief Element geometry for a single orientation of eve_t::place_data_t. */ /*! \var adobe::eve_t::place_data_t::slice_t::length_m \par length is the "active content" of the widget, and is also the space in which child widgets will be placed (if there are any). */ /*! \var adobe::eve_t::place_data_t::slice_t::position_m \par position is a point representing the top-left corner of the widget. The point can either be relative to the top-left point of the topmost view or the top-left point of the parent view depending on which option was specified to Eve at layout time. \sa \ref adobe::eve_t::evaluate_options_t */ /*! \var adobe::eve_t::place_data_t::slice_t::outset_m \par outset is the same as the outset value described in \ref adobe::eve_t::calculate_data_t::slice_t::outset_m. However because the outset can bleed through a parent widget, it is possible for the outset of any given widget to change during layout. Therefore this calculated outset value is returned to the client for proper placement of outset-affected widgets. */ /*! \var adobe::eve_t::place_data_t::slice_t::guides_m \par guides are the same as the guides values described in \ref adobe::eve_t::calculate_data_t::slice_t::guides_m. However now the values have been modified to coincide with other guide values presented to the engine. These guide values will ensure points of interest in this widget will "snap" to points of interest in other widgets. */ //***************************************************************************// //***************************************************************************// //***************************************************************************// /*! \class adobe::eve_t::signal_suite_t eve.hpp <adobe/eve.hpp> \ingroup eve_engine \brief Eve function interface between the engine and the client. */ /*! \var adobe::eve_t::signal_suite_t::eve_container_defaults_proc_m \par The container defaults proc is the first function called for a widget. It is only called when the widget is specified as being a container (whether or not it actually will contain children). This callback allows the client to set default container information about this type of widget before overrides are applied to it (by the parameters passed in or by other widgets imposing themselves on the container. Widget-specific measurements are not applied here: they should be calculated during the calculate callback proc. */ /*! \var adobe::eve_t::signal_suite_t::eve_calculate_proc_m \par The calculate proc is the time when the engine gets the widget-specific information from the client. The client is allowed to modify the calculate_data_t parameter passed in as they please in order to best describe the geometric details of this widget. This is the second (first if the widget is not a container) proc called while Eve is solving the layout. */ /*! \var adobe::eve_t::signal_suite_t::eve_calculate_vertical_proc_m \par Sometimes a widget's height is dependent upon the solved width of that widget. An example of this would be a widget with paginated text inside of it. In that case, the widget should provide a callback here to remeasure <i>just the vertical slice</i> information for the widget. All other information modified here will be discarded in favor of the values given during the first calculate call. */ /*! \var adobe::eve_t::signal_suite_t::eve_place_proc_m \par Place is the final callback signaled from the Eve engine to a widget. When this callback is made there are several guarantees for the client: - All parent views for this widget have already had their place callback signalled - All data provided in the place_data_t is the final geometric information for the widget. \par Note that this callback can be signalled multiple times- given a view re-layout (i.e. during a window resize event) the other callbacks will not be signalled- the layout will be adjusted internally in the Eve engine and only this callback will be signalled with updated placement information for the widget. */ //***************************************************************************// //***************************************************************************// //***************************************************************************// /*! \fn void adobe::set_margin(adobe::eve_t::calculate_data_t& container, long x) \ingroup eve_engine Quick way of setting every margin in a container to a single size. \param container geography for a container \param x value to which the margins should be set */ --- NEW FILE: name_t.dox --- /*! \class adobe::name_t name.hpp <adobe/name.hpp> \ingroup asl_libraries \brief A character string class for immutable strings. A name_t is a string class for immutable strings. The storage for name_t is globally pooled and strings are reused. Although an adobe::name_t can be somewhat expensive to construct, copying assignment, and equality comparisons are very fast. Because strings are reused, the pointer returned from name_t::get() can be used for indexing. \par Model Of: - \ref concept_regular_type - \ref stldoc_LessThanComparable - \ref concept_convertible_to_bool \par Rationale: \note The name_t class is thread safe when compiled with BOOST_HAS_THREADS defined. \todo The complexity of construction of a name_t is currently O(log(n)). An efficient hash implementation may improve efficiency. \todo Serialization support for name_t is not complete, but can be enabled by defining ADOBE_SERIALIZATION. */ /*! \fn adobe::name_t::name_t(const char* string_name = "") Constructs a name_t associated with string_name. If this is the first instance of this string, then the string will be copied to a pool with static storage duration. \pre \c string_name is a '\\0' terminated character sequence. */ /*! \fn adobe::name_t::name_t(const char* string_name, std::size_t length) Constructs a name_t associated with string_name. If this is the first instance of this string, then the string will be copied to a pool with static storage duration. \pre <code> [string_name, string_name + length) </code> is a sequence of non '\\0' characters. */ /*! \fn const char* adobe::name_t::get() const throw() Returns the associated '\\0' terminated string. \return a character pointer, guaranteed identical for equivalent strings. \par Semantic Requirements: The pointer returned is guaranteed identical for equivalent strings. i.e. <code>assert(name_t("test").get() == name_t("test").get());</code> */ /*! \class adobe::static_name_t name.hpp <adobe/name.hpp> \ingroup asl_libraries \brief Utility wrapper to construct name_t with strings of static storage duration. \promotes_to adobe::name_t */ /*! \fn adobe::static_name_t::static_name_t(const char* string_name = "") Constructs a static_name_t associated with string_name. The string will not be copied to the pool, however, it is not guaranteed that the associated string will be the identity of string_name. \pre \c string_name is a '\\0' terminated character sequence. \pre \c string_name is immutable, and has static storage duration \ref note_1 "[1]". \note \anchor note_1 [1] C++ Standard, second edition, (ISO/IEC 14882, 2003-04-01), section 3.7.1. */ /*! \class adobe::once_name_t name.hpp <adobe/name.hpp> \ingroup asl_libraries \brief Utility wrapper to construct name_t without initializing the string pointer. \promotes_to adobe::name_t \rationale The primary purpose of once_name_t is to provide a name_t implementation that can be used in a multithreaded environment as a static variable. Because its construction does nothing to initialize the value of the name_t, such initialization must take place during a threadsafe intialization function (boost::call_once, for instance). */ /*! \fn adobe::once_name_t::once_name_t() Constructs a name_t without pointing the name to a valid string. */ --- NEW FILE: rectangle_t.dox --- //***************************************************************************// //***************************************************************************// //***************************************************************************// /*! \class adobe::rectangle_t rectangle.hpp <adobe/rectangle.hpp> \ingroup asl_libraries \brief An intrinsic geometry class for objects with a graphical representation. rectangle_t is a totally ordered class for storing intrinsic geometry about a graphical element. Each rectangle_t is comprised of two slices. A slice stores intrinsic geometry about a graphical element for in a single direction, either vertically or horizontally. \model_of - \ref concept_regular_type \rationale rectangle_t is intended to describe only the properties of a graphical element which it retains intrinsically. Properties that involve an element as it relates to another element (like position) should not be described here. This is intended to separate the notions of intrinsic versus extrinsic values. This seems strange at first, but is justified when considering how to make a copy of an element's geometry: the copy will not have the same relationships as the original, so extrinsic values cannot be copied, nor can they be set to default values because there is no relationship to which they relate. Any extrinsic value in that case is equally meaningless. \todo (fbrereto) We need a better name than rectangle_t \todo (fbrereto) We need a better name than points_of_interest_t */ /*! \var boost::array<adobe::rectangle_t::slice_t, 2> adobe::rectangle_t::slice_m The two slices that comprise this rectangle. */ /*! \fn long& adobe::rectangle_t::height() \return a reference to length_m in the vertical slice. */ /*! \fn long& adobe::rectangle_t::width() \return a reference to length_m in the horizontal slice. */ /*! \fn const long& adobe::rectangle_t::height() const \return a reference to length_m in the vertical slice. */ /*! \fn const long& adobe::rectangle_t::width() const \return a reference to length_m in the horizontal slice. */ //***************************************************************************// //***************************************************************************// //***************************************************************************// /*! \class adobe::rectangle_slices_t rectangle.hpp <adobe/rectangle.hpp> \ingroup asl_libraries \brief A utility class for referencing the two slices of a rectangle_t. */ /*! \var adobe::rectangle_slices_t::horizontal An index used to reference the horizontal rectangle_t::slice_t in a rectangle_t. */ /*! \var adobe::rectangle_slices_t::vertical An index used to reference the vertical rectangle_t::slice_t in a rectangle_t. */ //***************************************************************************// //***************************************************************************// //***************************************************************************// /*! \class adobe::rectangle_t::slice_t rectangle.hpp <adobe/rectangle.hpp> \ingroup asl_libraries \brief A class containing element geometry for a single orientation. \par Model Of: Regular Type \par Rationale adobe::rectangle_t::slice_t is intended to make iterating over a rectangle easier. If the notion of orientation is abstracted out when manipulating geometries, it is possible to loop once over a series of rectangles in one direction, then again in the other. More code can be shared at that point, no matter which way you slice it. */ /*! \fn adobe::rectangle_t::slice_t::slice_t Default constructor. */ /*! \var long adobe::rectangle_t::slice_t::length_m The length of this slice. */ /*! \var pair_long_t adobe::rectangle_t::slice_t::outset_m Outset describes the amount outside the bounds of the element taken up by a graphic that can be absorbed by spacing. An example of this would be the drop shadow around a window. This value is a hither/yon pair, meaning the values represent the values on either side of the element being described for this orientation. */ /*! \var pair_long_t adobe::rectangle_t::slice_t::frame_m Frame describes the amount inside the bounds of the element taken up by a graphic that cannot be absorbed by spacing. This value is a hither/yon pair, meaning the values represent the values on either side of the element being described for this orientation. */ /*! \var pair_long_t adobe::rectangle_t::slice_t::inset_m Inset describes the amount inside the bounds of the element taken up by a graphic that can be absorbed by spacing. This value is a hither/yon pair, meaning the values represent the values on either side of the element being described for this orientation. */ /*! \var points_of_interest_t adobe::rectangle_t::slice_t::poi_m The points of interest for a slice are simply a vector of values relating to points inside the element that might be of some value to objects outside the element. Examples of these are baseline values, colon-alignment values, and the widths of subparts of the graphical element. Note that points of interest are intended to be snapped together - that is, the size of the element is able to grow and shrink so the points of interest between two related elements are the same for a given orient... [truncated message content] |
|
From: Foster B. <fos...@us...> - 2005-04-18 21:15:54
|
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/documentation/sources/asl/images In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/documentation/sources/asl/images Added Files: calculate_data_t.jpg calculate_data_t_slice_t.jpg Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: calculate_data_t.jpg --- (This appears to be a binary file; contents omitted.) --- NEW FILE: calculate_data_t_slice_t.jpg --- (This appears to be a binary file; contents omitted.) |
|
From: Foster B. <fos...@us...> - 2005-04-18 21:15:48
|
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/build/boost_lib/bindebug In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/build/boost_lib/bindebug Added Files: placeholder Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: placeholder --- |
|
From: Foster B. <fos...@us...> - 2005-04-18 21:15:48
|
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/build/boost_lib/boost_lib.xcode In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/build/boost_lib/boost_lib.xcode Added Files: project.pbxproj Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: project.pbxproj --- // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 39; objects = { 014CEA520018CE5811CA2923 = { buildSettings = { COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; ZERO_LINK = YES; }; isa = PBXBuildStyle; name = Development; }; 014CEA530018CE5811CA2923 = { buildSettings = { COPY_PHASE_STRIP = YES; GCC_ENABLE_FIX_AND_CONTINUE = NO; ZERO_LINK = NO; }; isa = PBXBuildStyle; name = Deployment; }; //010 //011 //012 //013 //014 //080 //081 //082 //083 //084 08FB7793FE84155DC02AAC07 = { buildSettings = { }; buildStyles = ( 014CEA520018CE5811CA2923, 014CEA530018CE5811CA2923, ); hasScannedForEncodings = 1; isa = PBXProject; mainGroup = 08FB7794FE84155DC02AAC07; projectDirPath = ""; targets = ( D2AAC045055464E500DB518D, ); }; 08FB7794FE84155DC02AAC07 = { children = ( 08FB7795FE84155DC02AAC07, 1AB674ADFE9D54B511CA2CBB, ); isa = PBXGroup; name = boost_lib; refType = 4; sourceTree = "<group>"; }; 08FB7795FE84155DC02AAC07 = { children = ( 89323D5107FA6C7400AB4B9B, 89C4833A07EFFB17007FD3D0, 89C4834C07EFFB92007FD3D0, ); isa = PBXGroup; name = libs; path = ../../../third_party/boost_tp/boost/libs; refType = 2; sourceTree = SOURCE_ROOT; }; //080 //081 //082 //083 //084 //1A0 //1A1 //1A2 //1A3 //1A4 1AB674ADFE9D54B511CA2CBB = { children = ( D2AAC046055464E500DB518D, ); isa = PBXGroup; name = Products; refType = 4; sourceTree = "<group>"; }; //1A0 //1A1 //1A2 //1A3 //1A4 //890 //891 //892 //893 //894 89323D5107FA6C7400AB4B9B = { children = ( 89323D5207FA6C9400AB4B9B, ); isa = PBXGroup; path = filesystem; refType = 4; sourceTree = "<group>"; }; 89323D5207FA6C9400AB4B9B = { children = ( 89323D5307FA6C9400AB4B9B, 89323D5407FA6C9400AB4B9B, 89323D5507FA6C9400AB4B9B, 89323D5607FA6C9400AB4B9B, ); isa = PBXGroup; path = src; refType = 4; sourceTree = "<group>"; }; 89323D5307FA6C9400AB4B9B = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = convenience.cpp; refType = 4; sourceTree = "<group>"; }; 89323D5407FA6C9400AB4B9B = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = exception.cpp; refType = 4; sourceTree = "<group>"; }; 89323D5507FA6C9400AB4B9B = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = operations_posix_windows.cpp; refType = 4; sourceTree = "<group>"; }; 89323D5607FA6C9400AB4B9B = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = path_posix_windows.cpp; refType = 4; sourceTree = "<group>"; }; 89323D5707FA6C9400AB4B9B = { fileRef = 89323D5307FA6C9400AB4B9B; isa = PBXBuildFile; settings = { }; }; 89323D5807FA6C9400AB4B9B = { fileRef = 89323D5407FA6C9400AB4B9B; isa = PBXBuildFile; settings = { }; }; 89323D5907FA6C9400AB4B9B = { fileRef = 89323D5507FA6C9400AB4B9B; isa = PBXBuildFile; settings = { }; }; 89323D5A07FA6C9400AB4B9B = { fileRef = 89323D5607FA6C9400AB4B9B; isa = PBXBuildFile; settings = { }; }; 89C4833A07EFFB17007FD3D0 = { children = ( 89C4833D07EFFB65007FD3D0, ); isa = PBXGroup; path = signals; refType = 4; sourceTree = "<group>"; }; 89C4833D07EFFB65007FD3D0 = { children = ( 89C4834007EFFB8A007FD3D0, 89C4834107EFFB8A007FD3D0, 89C4834207EFFB8A007FD3D0, 89C4834307EFFB8A007FD3D0, 89C4834407EFFB8A007FD3D0, ); isa = PBXGroup; path = src; refType = 4; sourceTree = "<group>"; }; 89C4834007EFFB8A007FD3D0 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = connection.cpp; refType = 4; sourceTree = "<group>"; }; 89C4834107EFFB8A007FD3D0 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = named_slot_map.cpp; refType = 4; sourceTree = "<group>"; }; 89C4834207EFFB8A007FD3D0 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = signal_base.cpp; refType = 4; sourceTree = "<group>"; }; 89C4834307EFFB8A007FD3D0 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = slot.cpp; refType = 4; sourceTree = "<group>"; }; 89C4834407EFFB8A007FD3D0 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = trackable.cpp; refType = 4; sourceTree = "<group>"; }; 89C4834507EFFB8A007FD3D0 = { fileRef = 89C4834007EFFB8A007FD3D0; isa = PBXBuildFile; settings = { }; }; 89C4834607EFFB8A007FD3D0 = { fileRef = 89C4834107EFFB8A007FD3D0; isa = PBXBuildFile; settings = { }; }; 89C4834707EFFB8A007FD3D0 = { fileRef = 89C4834207EFFB8A007FD3D0; isa = PBXBuildFile; settings = { }; }; 89C4834807EFFB8A007FD3D0 = { fileRef = 89C4834307EFFB8A007FD3D0; isa = PBXBuildFile; settings = { }; }; 89C4834907EFFB8A007FD3D0 = { fileRef = 89C4834407EFFB8A007FD3D0; isa = PBXBuildFile; settings = { }; }; 89C4834C07EFFB92007FD3D0 = { children = ( 89C4835107EFFBAF007FD3D0, ); isa = PBXGroup; path = thread; refType = 4; sourceTree = "<group>"; }; 89C4835107EFFBAF007FD3D0 = { children = ( 89C4835407EFFBD9007FD3D0, 89C4835507EFFBD9007FD3D0, 89C4835607EFFBD9007FD3D0, ); isa = PBXGroup; path = src; refType = 4; sourceTree = "<group>"; }; 89C4835407EFFBD9007FD3D0 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = exceptions.cpp; refType = 4; sourceTree = "<group>"; }; 89C4835507EFFBD9007FD3D0 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = mutex.cpp; refType = 4; sourceTree = "<group>"; }; 89C4835607EFFBD9007FD3D0 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = once.cpp; refType = 4; sourceTree = "<group>"; }; 89C4835707EFFBD9007FD3D0 = { fileRef = 89C4835407EFFBD9007FD3D0; isa = PBXBuildFile; settings = { }; }; 89C4835807EFFBD9007FD3D0 = { fileRef = 89C4835507EFFBD9007FD3D0; isa = PBXBuildFile; settings = { }; }; 89C4835907EFFBD9007FD3D0 = { fileRef = 89C4835607EFFBD9007FD3D0; isa = PBXBuildFile; settings = { }; }; //890 //891 //892 //893 //894 //D20 //D21 //D22 //D23 //D24 D289987405E68DCB004EDB86 = { buildActionMask = 2147483647; files = ( ); isa = PBXFrameworksBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; D2AAC043055464E500DB518D = { buildActionMask = 2147483647; files = ( ); isa = PBXHeadersBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; D2AAC044055464E500DB518D = { buildActionMask = 2147483647; files = ( 89C4834507EFFB8A007FD3D0, 89C4834607EFFB8A007FD3D0, 89C4834707EFFB8A007FD3D0, 89C4834807EFFB8A007FD3D0, 89C4834907EFFB8A007FD3D0, 89C4835707EFFBD9007FD3D0, 89C4835807EFFBD9007FD3D0, 89C4835907EFFBD9007FD3D0, 89323D5707FA6C9400AB4B9B, 89323D5807FA6C9400AB4B9B, 89323D5907FA6C9400AB4B9B, 89323D5A07FA6C9400AB4B9B, ); isa = PBXSourcesBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; D2AAC045055464E500DB518D = { buildPhases = ( D2AAC043055464E500DB518D, D2AAC044055464E500DB518D, D289987405E68DCB004EDB86, ); buildRules = ( ); buildSettings = { GCC_GENERATE_DEBUGGING_SYMBOLS = NO; HEADER_SEARCH_PATHS = ../../../third_party/boost_tp/boost/; INSTALL_PATH = /usr/local/lib; LIBRARY_STYLE = STATIC; PRODUCT_NAME = boost; WARNING_CFLAGS = "-Wno-long-double"; }; dependencies = ( ); isa = PBXNativeTarget; name = boost; productName = boost_lib; productReference = D2AAC046055464E500DB518D; productType = "com.apple.product-type.library.static"; }; D2AAC046055464E500DB518D = { explicitFileType = archive.ar; includeInIndex = 0; isa = PBXFileReference; path = libboost.a; refType = 3; sourceTree = BUILT_PRODUCTS_DIR; }; }; rootObject = 08FB7793FE84155DC02AAC07; } |
|
From: Foster B. <fos...@us...> - 2005-04-18 21:15:47
|
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/build/boost_lib/bin In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/build/boost_lib/bin Added Files: placeholder Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: placeholder --- |
|
From: Foster B. <fos...@us...> - 2005-04-18 21:15:47
|
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/build/asl_lib_dev/bin In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/build/asl_lib_dev/bin Added Files: placeholder Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: placeholder --- |
|
From: Foster B. <fos...@us...> - 2005-04-18 21:15:47
|
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/build/boost_lib In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/build/boost_lib Added Files: boost_lib.mcp boost_lib.sln boost_lib.vcproj Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: boost_lib.vcproj --- <?xml version="1.0" encoding="Windows-1252"?> <VisualStudioProject ProjectType="Visual C++" Version="7.10" Name="boost_lib" ProjectGUID="{190F47CE-E201-4ACC-8B49-E52180EE16EB}" Keyword="Win32Proj"> <Platforms> <Platform Name="Win32"/> </Platforms> <Configurations> <Configuration Name="Debug|Win32" OutputDirectory="bindebug" IntermediateDirectory="Debug" ConfigurationType="4" CharacterSet="2"> <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="..\..\..\third_party\boost_tp\boost;..\..\..\" PreprocessorDefinitions="WIN32;_DEBUG;_LIB;BOOST_ALL_NO_LIB=1;BOOST_THREAD_USE_LIB=1" MinimalRebuild="TRUE" BasicRuntimeChecks="3" RuntimeLibrary="1" UsePrecompiledHeader="0" WarningLevel="3" Detect64BitPortabilityProblems="TRUE" DebugInformationFormat="4"/> <Tool Name="VCCustomBuildTool"/> <Tool Name="VCLibrarianTool" OutputFile="$(OutDir)/boost_lib.lib"/> <Tool Name="VCMIDLTool"/> <Tool Name="VCPostBuildEventTool"/> <Tool Name="VCPreBuildEventTool"/> <Tool Name="VCPreLinkEventTool"/> <Tool Name="VCResourceCompilerTool"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> <Tool Name="VCXMLDataGeneratorTool"/> <Tool Name="VCManagedWrapperGeneratorTool"/> <Tool Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> <Configuration Name="Release|Win32" OutputDirectory="bin" IntermediateDirectory="Release" ConfigurationType="4" CharacterSet="2"> <Tool Name="VCCLCompilerTool" AdditionalIncludeDirectories="..\..\..\third_party\boost_tp\boost;..\..\..\" PreprocessorDefinitions="WIN32;NDEBUG;_LIB;BOOST_ALL_NO_LIB=1" RuntimeLibrary="0" UsePrecompiledHeader="0" WarningLevel="3" Detect64BitPortabilityProblems="TRUE" DebugInformationFormat="3"/> <Tool Name="VCCustomBuildTool"/> <Tool Name="VCLibrarianTool" OutputFile="$(OutDir)/boost_lib.lib"/> <Tool Name="VCMIDLTool"/> <Tool Name="VCPostBuildEventTool"/> <Tool Name="VCPreBuildEventTool"/> <Tool Name="VCPreLinkEventTool"/> <Tool Name="VCResourceCompilerTool"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> <Tool Name="VCXMLDataGeneratorTool"/> <Tool Name="VCManagedWrapperGeneratorTool"/> <Tool Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> </Configurations> <References> </References> <Files> <Filter Name="Source Files" Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> <File RelativePath="..\..\..\third_party\boost_tp\boost\libs\signals\src\connection.cpp"> </File> <File RelativePath="..\..\..\third_party\boost_tp\boost\libs\filesystem\src\convenience.cpp"> </File> <File RelativePath="..\..\..\third_party\boost_tp\boost\libs\filesystem\src\exception.cpp"> </File> <File RelativePath="..\..\..\third_party\boost_tp\boost\libs\thread\src\exceptions.cpp"> </File> <File RelativePath="..\..\..\third_party\boost_tp\boost\libs\thread\src\mutex.cpp"> </File> <File RelativePath="..\..\..\third_party\boost_tp\boost\libs\signals\src\named_slot_map.cpp"> </File> <File RelativePath="..\..\..\third_party\boost_tp\boost\libs\thread\src\once.cpp"> </File> <File RelativePath="..\..\..\third_party\boost_tp\boost\libs\filesystem\src\operations_posix_windows.cpp"> </File> <File RelativePath="..\..\..\third_party\boost_tp\boost\libs\filesystem\src\path_posix_windows.cpp"> </File> <File RelativePath="..\..\..\third_party\boost_tp\boost\libs\signals\src\signal_base.cpp"> </File> <File RelativePath="..\..\..\third_party\boost_tp\boost\libs\signals\src\slot.cpp"> </File> <File RelativePath="..\..\..\third_party\boost_tp\boost\libs\signals\src\trackable.cpp"> </File> </Filter> </Files> <Globals> </Globals> </VisualStudioProject> --- NEW FILE: boost_lib.mcp --- (This appears to be a binary file; contents omitted.) --- NEW FILE: boost_lib.sln --- Microsoft Visual Studio Solution File, Format Version 8.00 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "boost_lib", "boost_lib.vcproj", "{190F47CE-E201-4ACC-8B49-E52180EE16EB}" ProjectSection(ProjectDependencies) = postProject EndProjectSection EndProject Global GlobalSection(SolutionConfiguration) = preSolution Debug = Debug Release = Release EndGlobalSection GlobalSection(ProjectConfiguration) = postSolution {190F47CE-E201-4ACC-8B49-E52180EE16EB}.Debug.ActiveCfg = Debug|Win32 {190F47CE-E201-4ACC-8B49-E52180EE16EB}.Debug.Build.0 = Debug|Win32 {190F47CE-E201-4ACC-8B49-E52180EE16EB}.Release.ActiveCfg = Release|Win32 {190F47CE-E201-4ACC-8B49-E52180EE16EB}.Release.Build.0 = Release|Win32 EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution EndGlobalSection GlobalSection(ExtensibilityAddIns) = postSolution EndGlobalSection EndGlobal |
|
From: Foster B. <fos...@us...> - 2005-04-18 21:15:46
|
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/build/asl_lib_dev/bindebug In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/build/asl_lib_dev/bindebug Added Files: placeholder Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: placeholder --- |
|
From: Foster B. <fos...@us...> - 2005-04-18 21:15:46
|
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/build/boilerplate In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/build/boilerplate Added Files: boilerplate.mcp boilerplate.vcproj main.cpp Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: main.cpp --- /* Copyright 2005 Adobe Systems Incorporated Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt or a copy at http://opensource.adobe.com/licenses.html) */ #include <iostream> #include <boost/config.hpp> int main() { bool bool_array[100]; for (int i(0); i < 100; ++i) { std :: cout << std::boolalpha << bool_array[i] << " "; } } --- NEW FILE: boilerplate.mcp --- (This appears to be a binary file; contents omitted.) --- NEW FILE: boilerplate.vcproj --- <?xml version="1.0" encoding="Windows-1252"?> <VisualStudioProject ProjectType="Visual C++" Version="7.10" Name="boilerplate" ProjectGUID="{FB1D09A2-C1D9-4674-BED2-8B5F36494898}" Keyword="Win32Proj"> <Platforms> <Platform Name="Win32"/> </Platforms> <Configurations> <Configuration Name="Debug|Win32" OutputDirectory="Debug" IntermediateDirectory="Debug" ConfigurationType="1" CharacterSet="2"> <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="..\..\..\;..\..\..\third_party\boost_tp\boost" PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE" MinimalRebuild="TRUE" BasicRuntimeChecks="3" RuntimeLibrary="5" UsePrecompiledHeader="0" WarningLevel="3" Detect64BitPortabilityProblems="TRUE" DebugInformationFormat="4"/> <Tool Name="VCCustomBuildTool"/> <Tool Name="VCLinkerTool" AdditionalDependencies="asl_lib.lib" OutputFile="$(OutDir)/boilerplate.exe" LinkIncremental="2" AdditionalLibraryDirectories="..\asl_lib\bindebug" GenerateDebugInformation="TRUE" ProgramDatabaseFile="$(OutDir)/boilerplate.pdb" SubSystem="1" TargetMachine="1"/> <Tool Name="VCMIDLTool"/> <Tool Name="VCPostBuildEventTool"/> <Tool Name="VCPreBuildEventTool"/> <Tool Name="VCPreLinkEventTool"/> <Tool Name="VCResourceCompilerTool"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> <Tool Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> <Tool Name="VCManagedWrapperGeneratorTool"/> <Tool Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> <Configuration Name="Release|Win32" OutputDirectory="Release" IntermediateDirectory="Release" ConfigurationType="1" CharacterSet="2"> <Tool Name="VCCLCompilerTool" AdditionalIncludeDirectories="..\..\..\;..\..\..\third_party\boost_tp\boost" PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" RuntimeLibrary="4" UsePrecompiledHeader="0" WarningLevel="3" Detect64BitPortabilityProblems="TRUE" DebugInformationFormat="3"/> <Tool Name="VCCustomBuildTool"/> <Tool Name="VCLinkerTool" AdditionalDependencies="asl_lib.lib" OutputFile="$(OutDir)/boilerplate.exe" LinkIncremental="1" AdditionalLibraryDirectories="..\asl_lib\bin" GenerateDebugInformation="TRUE" SubSystem="1" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="1"/> <Tool Name="VCMIDLTool"/> <Tool Name="VCPostBuildEventTool"/> <Tool Name="VCPreBuildEventTool"/> <Tool Name="VCPreLinkEventTool"/> <Tool Name="VCResourceCompilerTool"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> <Tool Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> <Tool Name="VCManagedWrapperGeneratorTool"/> <Tool Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> </Configurations> <References> </References> <Files> <Filter Name="Source Files" Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> <File RelativePath=".\main.cpp"> </File> </Filter> <Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl;inc;xsd" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"> </Filter> </Files> <Globals> </Globals> </VisualStudioProject> |
|
From: Foster B. <fos...@us...> - 2005-04-18 21:15:45
|
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/build/asl_lib/bindebug In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/build/asl_lib/bindebug Added Files: placeholder Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: placeholder --- |
|
From: Foster B. <fos...@us...> - 2005-04-18 21:15:45
|
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/build/asl_lib/bin In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/build/asl_lib/bin Added Files: placeholder Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: placeholder --- |
|
From: Foster B. <fos...@us...> - 2005-04-18 21:15:45
|
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/build/asl_lib_dev In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/build/asl_lib_dev Added Files: asl_lib_dev.mcp asl_lib_dev.sln asl_lib_dev.vcproj Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: asl_lib_dev.sln --- Microsoft Visual Studio Solution File, Format Version 8.00 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "asl_lib_dev", "asl_lib_dev.vcproj", "{95184C7D-CE28-4D94-9A94-C9CC53562DB5}" ProjectSection(ProjectDependencies) = postProject EndProjectSection EndProject Global GlobalSection(SolutionConfiguration) = preSolution Debug = Debug Release = Release EndGlobalSection GlobalSection(ProjectConfiguration) = postSolution {95184C7D-CE28-4D94-9A94-C9CC53562DB5}.Debug.ActiveCfg = Debug|Win32 {95184C7D-CE28-4D94-9A94-C9CC53562DB5}.Debug.Build.0 = Debug|Win32 {95184C7D-CE28-4D94-9A94-C9CC53562DB5}.Release.ActiveCfg = Release|Win32 {95184C7D-CE28-4D94-9A94-C9CC53562DB5}.Release.Build.0 = Release|Win32 EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution EndGlobalSection GlobalSection(ExtensibilityAddIns) = postSolution EndGlobalSection EndGlobal --- NEW FILE: asl_lib_dev.mcp --- (This appears to be a binary file; contents omitted.) --- NEW FILE: asl_lib_dev.vcproj --- <?xml version="1.0" encoding="Windows-1252"?> <VisualStudioProject ProjectType="Visual C++" Version="7.10" Name="asl_lib_dev" ProjectGUID="{95184C7D-CE28-4D94-9A94-C9CC53562DB5}" RootNamespace="asl_lib_dev" SccProjectName="Perforce Project" SccAuxPath="" SccLocalPath="..\.." SccProvider="MSSCCI:Perforce SCM" Keyword="Win32Proj"> <Platforms> <Platform Name="Win32"/> </Platforms> <Configurations> <Configuration Name="Debug|Win32" OutputDirectory="bindebug" IntermediateDirectory="Debug" ConfigurationType="4" CharacterSet="1"> <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="..\..\..\third_party\boost_tp\boost;..\..\..\" PreprocessorDefinitions="ADOBE_SERIALIZATION=1;BOOST_ALL_NO_LIB=1;WIN32;_LIB" MinimalRebuild="FALSE" BasicRuntimeChecks="3" RuntimeLibrary="5" DisableLanguageExtensions="FALSE" TreatWChar_tAsBuiltInType="TRUE" ForceConformanceInForLoopScope="TRUE" RuntimeTypeInfo="TRUE" UsePrecompiledHeader="0" WarningLevel="3" Detect64BitPortabilityProblems="TRUE" DebugInformationFormat="4"/> <Tool Name="VCCustomBuildTool"/> <Tool Name="VCLibrarianTool" OutputFile="$(OutDir)/asl_lib_dev.lib" AdditionalLibraryDirectories=""/> <Tool Name="VCMIDLTool"/> <Tool Name="VCPostBuildEventTool"/> <Tool Name="VCPreBuildEventTool"/> <Tool Name="VCPreLinkEventTool"/> <Tool Name="VCResourceCompilerTool"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> <Tool Name="VCXMLDataGeneratorTool"/> <Tool Name="VCManagedWrapperGeneratorTool"/> <Tool Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> <Configuration Name="Release|Win32" OutputDirectory="bin" IntermediateDirectory="Release" ConfigurationType="4" CharacterSet="1"> <Tool Name="VCCLCompilerTool" Optimization="1" GlobalOptimizations="TRUE" FavorSizeOrSpeed="2" AdditionalIncludeDirectories="..\..\..\third_party\boost_tp\boost;..\..\..\" PreprocessorDefinitions="ADOBE_SERIALIZATION=1;BOOST_ALL_NO_LIB=1;WIN32;NDEBUG;_LIB" MinimalRebuild="FALSE" RuntimeLibrary="4" DisableLanguageExtensions="FALSE" TreatWChar_tAsBuiltInType="TRUE" ForceConformanceInForLoopScope="TRUE" RuntimeTypeInfo="TRUE" UsePrecompiledHeader="0" WarningLevel="3" Detect64BitPortabilityProblems="TRUE" DebugInformationFormat="3"/> <Tool Name="VCCustomBuildTool"/> <Tool Name="VCLibrarianTool" OutputFile="$(OutDir)/asl_lib_dev.lib" AdditionalLibraryDirectories=""/> <Tool Name="VCMIDLTool"/> <Tool Name="VCPostBuildEventTool"/> <Tool Name="VCPreBuildEventTool"/> <Tool Name="VCPreLinkEventTool"/> <Tool Name="VCResourceCompilerTool"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> <Tool Name="VCXMLDataGeneratorTool"/> <Tool Name="VCManagedWrapperGeneratorTool"/> <Tool Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> </Configurations> <References> </References> <Files> <Filter Name="Source Files" Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> <File RelativePath="..\..\source\adam.cpp"> </File> <File RelativePath="..\..\source\adam_evaluate.cpp"> </File> <File RelativePath="..\..\source\adam_parser.cpp"> </File> <File RelativePath="..\..\source\array.cpp"> </File> <File RelativePath="..\..\source\dictionary.cpp"> </File> <File RelativePath="..\..\source\eve.cpp"> </File> <File RelativePath="..\..\source\eve_evaluate.cpp"> </File> <File RelativePath="..\..\source\eve_parser.cpp"> </File> <File RelativePath="..\..\source\expression_parser.cpp"> </File> <File RelativePath="..\..\source\istream.cpp"> </File> <File RelativePath="..\..\source\lex_stream.cpp"> </File> <File RelativePath="..\..\source\name.cpp"> </File> <File RelativePath="..\..\source\parser_shared.cpp"> </File> <File RelativePath="..\..\source\rectangle.cpp"> </File> <File RelativePath="..\..\source\string_pool.cpp"> </File> <File RelativePath="..\..\source\test_configuration.cpp"> </File> <File RelativePath="..\..\source\token.cpp"> </File> <File RelativePath="..\..\source\typeinfo.cpp"> </File> <File RelativePath="..\..\source\value.cpp"> </File> <File RelativePath="..\..\source\virtual_machine.cpp"> </File> </Filter> </Files> <Globals> </Globals> </VisualStudioProject> |
|
From: Foster B. <fos...@us...> - 2005-04-18 21:15:44
|
Update of /cvsroot/adobe-source/sandbox/visual_refactor/adobe/build/asl_lib/asl_lib.xcode In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27679/adobe/build/asl_lib/asl_lib.xcode Added Files: project.pbxproj Log Message: SO SORRY for the large qty of emails -- creating a branch for Adobe Begin refactoring. --- NEW FILE: project.pbxproj --- // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 39; objects = { 014CEA520018CE5811CA2923 = { buildSettings = { COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; ZERO_LINK = YES; }; isa = PBXBuildStyle; name = Development; }; [...1035 lines suppressed...] }; dependencies = ( ); isa = PBXNativeTarget; name = asl; productName = asl_lib; productReference = D2AAC046055464E500DB518D; productType = "com.apple.product-type.library.static"; }; D2AAC046055464E500DB518D = { explicitFileType = archive.ar; includeInIndex = 0; isa = PBXFileReference; path = libasl.a; refType = 3; sourceTree = BUILT_PRODUCTS_DIR; }; }; rootObject = 08FB7793FE84155DC02AAC07; } |