[continued from previous message]   
      
    void ifTrue(const std::function& trueBlock, const st   
   ::function& falseBlock) override {   
    trueBlock();   
    }   
   };   
      
   class False : public Boolean {   
   public:   
    void ifTrue(const std::function& block) override {}   
      
    void ifFalse(const std::function& block) override {   
    block();   
    }   
      
    void ifTrue(const std::function& trueBlock, const st   
   ::function& falseBlock) override {   
    falseBlock();   
    }   
   };   
      
   int main() {   
    True true_obj;   
    False false_obj;   
      
    int a = -5;   
    (a < 0 ? true_obj : false_obj).ifTrue([&]() { a = 0; });   
    std::cout << a << std::endl;   
      
    int b = 10;   
    (b < 0 ? true_obj : false_obj).ifTrue([&]() { b = 0; });   
    std::cout << b << std::endl;   
      
    (a == 0 && b == 10 ? true_obj : false_obj).ifTrue(   
    []() { std::cout << "Both conditions are true" << std::endl; },   
    []() { std::cout << "At least one condition is false" << std::endl; }   
    );   
      
    return 0;   
   }   
      
    , C,   
      
   #include    
   #include    
      
   typedef struct Boolean Boolean;   
   typedef struct True True;   
   typedef struct False False;   
      
   struct Boolean {   
    void (*ifTrue)(Boolean* self, void (*block)(void));   
    void (*ifFalse)(Boolean* self, void (*block)(void));   
    void (*ifTrueIfFalse)(Boolean* self, void (*trueBlock)(void), void   
   (*falseBlock)(void));   
   };   
      
   struct True {   
    Boolean base;   
   };   
      
   struct False {   
    Boolean base;   
   };   
      
   void True_ifTrue(Boolean* self, void (*block)(void)) {   
    block();   
   }   
      
   void True_ifFalse(Boolean* self, void (*block)(void)) {   
    // Do nothing   
   }   
      
   void True_ifTrueIfFalse(Boolean* self, void (*trueBlock)(void), void   
   (*falseBlock)(void)) {   
    trueBlock();   
   }   
      
   void False_ifTrue(Boolean* self, void (*block)(void)) {   
    // Do nothing   
   }   
      
   void False_ifFalse(Boolean* self, void (*block)(void)) {   
    block();   
   }   
      
   void False_ifTrueIfFalse(Boolean* self, void (*trueBlock)(void), void   
   (*falseBlock)(void)) {   
    falseBlock();   
   }   
      
   True true_obj = {{True_ifTrue, True_ifFalse, True_ifTrueIfFalse}};   
   False false_obj = {{False_ifTrue, False_ifFalse, False_ifTrueIfFalse}};   
      
   #define TRUE ((Boolean*)&true_obj)   
   #define FALSE ((Boolean*)&false_obj)   
      
   int main() {   
    int a = -5;   
    (a < 0 ? TRUE : FALSE)->ifTrue(^{   
    a = 0;   
    });   
    printf("%d\n", a);   
      
    int b = 10;   
    (b < 0 ? TRUE : FALSE)->ifTrue(^{   
    b = 0;   
    });   
    printf("%d\n", b);   
      
    (a == 0 && b == 10 ? TRUE : FALSE)->ifTrueIfFalse(   
    ^{ printf("Both conditions are true\n"); },   
    ^{ printf("At least one condition is false\n"); }   
    );   
      
    return 0;   
   }   
      
    .   
      
   --- SoupGate-DOS v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   
|