@@ -103,21 +103,39 @@ public static Node replaceAllInplace(final Node root, final Predicate<Node> who,
103103 }
104104 }
105105
106+ /**
107+ * Wraps a literal name in a defined statement.
108+ * x -> defined(x)
109+ * !x -> !defined(x)
110+ */
111+ private static Node ifdef (final Literal l ) {
112+ final Function <Object , Literal > toDefinedLiteral = s -> new Literal ("defined(" + s + ")" );
113+
114+ if (l .positive ) {
115+ return toDefinedLiteral .apply (l );
116+ } else {
117+ return new Not (toDefinedLiteral .apply (new Literal (l .var , true )));
118+ }
119+ }
120+
106121 /**
107122 * Serializes the given formula to a string usable in C preprocessor conditions.
108123 * True and false will be converted to 1 and 0, respectively.
109124 * Variables will be wrapped in a defined expression.
110125 * @see FixTrueFalse#TrueAs1
111126 * @see FixTrueFalse#FalseAs0
112127 */
113- public static String toCPPString (Node formula , final String [] symbols ) {
128+ public static String toCPPString (Node formula ) {
114129 formula = replaceAll (formula , FixTrueFalse ::isTrue , n -> FixTrueFalse .TrueAs1 );
115130 formula = replaceAllInplace (formula , FixTrueFalse ::isFalse , n -> FixTrueFalse .FalseAs0 );
116- formula = replaceAllInplace (formula , FixTrueFalse ::isVariable , n -> new Literal ("defined(" + n .toString () + ")" ));
117- return toFormulaString (formula , symbols );
131+ formula = replaceAllInplace (formula , FixTrueFalse ::isVariable ,
132+ // we know that n is a literal because FixTureFalse::isVariable returned true
133+ n -> ifdef ((Literal ) n )
134+ );
135+ return toFormulaString (formula , NodeWriter .javaSymbols );
118136 }
119137
120- public static String toFormulaString (Node formula , final String [] symbols ) {
138+ public static String toFormulaString (final Node formula , final String [] symbols ) {
121139 final NodeWriter writer = new NodeWriter (formula );
122140 writer .setNotation (NodeWriter .Notation .INFIX );
123141 writer .setEnquoteWhitespace (false );
0 commit comments