@@ -496,22 +496,6 @@ abstract_object_pointert intervals_expression_transform(
496
496
497
497
// ///////////////////////////////////////////////////////
498
498
// value_set expression transform
499
- static abstract_object_pointert value_set_evaluate_conditional (
500
- const typet &type,
501
- const std::vector<value_ranget> &operands,
502
- const abstract_environmentt &env,
503
- const namespacet &ns);
504
-
505
- static std::vector<value_ranget>
506
- unwrap_operands (const std::vector<abstract_object_pointert> &operands);
507
-
508
- // / Helper for converting context objects into its abstract-value children
509
- // / \p maybe_wrapped: either an abstract value (or a set of those) or one
510
- // / wrapped in a context
511
- // / \return an abstract value without context (though it might be as set)
512
- static abstract_object_pointert
513
- maybe_unwrap_context (const abstract_object_pointert &maybe_wrapped);
514
-
515
499
static exprt rewrite_expression (
516
500
const exprt &expr,
517
501
const std::vector<abstract_object_pointert> &ops);
@@ -564,155 +548,155 @@ abstract_object_sett evaluate_each_combination(
564
548
return results;
565
549
}
566
550
567
- static abstract_object_pointert resolve_new_values (
568
- const abstract_object_sett &new_values,
569
- const abstract_environmentt &environment);
551
+ class value_set_evaluator
552
+ {
553
+ public:
554
+ value_set_evaluator (
555
+ const exprt &e,
556
+ const std::vector<abstract_object_pointert> &ops,
557
+ const abstract_environmentt &env,
558
+ const namespacet &n)
559
+ : expression(e), operands(ops), environment(env), ns(n)
560
+ {
561
+ PRECONDITION (expression.operands ().size () == operands.size ());
562
+ }
570
563
571
- static abstract_object_pointert
572
- resolve_values (const abstract_object_sett &new_values);
573
- static abstract_object_sett
574
- unwrap_and_extract_values (const abstract_object_sett &values);
575
- static abstract_object_pointert
576
- maybe_extract_single_value (const abstract_object_pointert &maybe_singleton);
564
+ abstract_object_pointert operator ()() const
565
+ {
566
+ return transform ();
567
+ }
577
568
578
- static abstract_object_pointert value_set_expression_transform (
579
- const exprt &expr,
580
- const std::vector<abstract_object_pointert> &operands,
581
- const abstract_environmentt &environment,
582
- const namespacet &ns)
583
- {
584
- PRECONDITION (operands.size () == expr.operands ().size ());
569
+ private:
570
+ abstract_object_pointert transform () const
571
+ {
572
+ auto collective_operands = unwrap_operands ();
585
573
586
- auto collective_operands = unwrap_operands (operands);
574
+ if (expression.id () == ID_if)
575
+ return value_set_evaluate_conditional (collective_operands);
587
576
588
- if (expr.id () == ID_if)
589
- return value_set_evaluate_conditional (
590
- expr.type (), collective_operands, environment, ns);
577
+ auto resulting_objects = evaluate_each_combination (
578
+ collective_operands, expression, environment, ns);
591
579
592
- auto resulting_objects =
593
- evaluate_each_combination (collective_operands, expr, environment, ns);
580
+ return resolve_new_values (resulting_objects);
581
+ }
594
582
595
- return resolve_new_values (resulting_objects, environment);
596
- }
583
+ std::vector<value_ranget> unwrap_operands () const
584
+ {
585
+ auto unwrapped = std::vector<value_ranget>{};
597
586
598
- abstract_object_pointert value_set_evaluate_conditional (
599
- const typet &type,
600
- const std::vector<value_ranget> &operands,
601
- const abstract_environmentt &env,
602
- const namespacet &ns)
603
- {
604
- auto const &condition = operands[ 0 ];
587
+ for ( const auto &op : operands)
588
+ {
589
+ auto av = std::dynamic_pointer_cast< const abstract_value_objectt>(
590
+ op-> unwrap_context ());
591
+ INVARIANT (av, " should be an abstract value object " );
592
+ unwrapped. emplace_back (av-> value_range ());
593
+ }
605
594
606
- auto const &true_result = operands[ 1 ] ;
607
- auto const &false_result = operands[ 2 ];
595
+ return unwrapped ;
596
+ }
608
597
609
- auto all_true = true ;
610
- auto all_false = true ;
611
- for (auto v : condition)
598
+ static abstract_object_sett
599
+ unwrap_and_extract_values (const abstract_object_sett &values)
612
600
{
613
- auto expr = v->to_constant ();
614
- all_true = all_true && expr.is_true ();
615
- all_false = all_false && expr.is_false ();
601
+ abstract_object_sett unwrapped_values;
602
+ for (auto const &value : values)
603
+ {
604
+ unwrapped_values.insert (
605
+ maybe_extract_single_value (value->unwrap_context ()));
606
+ }
607
+
608
+ return unwrapped_values;
616
609
}
617
- auto indeterminate = !all_true && !all_false;
618
610
619
- abstract_object_sett resulting_objects;
620
- if (all_true || indeterminate)
621
- resulting_objects.insert (true_result);
622
- if (all_false || indeterminate)
623
- resulting_objects.insert (false_result);
624
- return resolve_new_values (resulting_objects, env);
625
- }
611
+ static abstract_object_pointert
612
+ maybe_extract_single_value (const abstract_object_pointert &maybe_singleton)
613
+ {
614
+ auto const &value_as_set =
615
+ std::dynamic_pointer_cast<const value_set_tag>(maybe_singleton);
616
+ if (value_as_set)
617
+ {
618
+ PRECONDITION (value_as_set->get_values ().size () == 1 );
619
+ PRECONDITION (!std::dynamic_pointer_cast<const context_abstract_objectt>(
620
+ value_as_set->get_values ().first ()));
626
621
627
- static std::vector<value_ranget>
628
- unwrap_operands (const std::vector<abstract_object_pointert> &operands)
629
- {
630
- auto unwrapped = std::vector<value_ranget>{};
622
+ return value_as_set->get_values ().first ();
623
+ }
624
+ else
625
+ return maybe_singleton;
626
+ }
631
627
632
- for (const auto &op : operands)
628
+ abstract_object_pointert
629
+ resolve_new_values (const abstract_object_sett &new_values) const
633
630
{
634
- auto av = std::dynamic_pointer_cast<const abstract_value_objectt>(
635
- maybe_unwrap_context (op));
636
- // INVARIANT(av, "should be an abstract value object");
637
- if (av)
638
- unwrapped.emplace_back (av->value_range ());
639
- else // Forthcoming work will eliminate this line
640
- unwrapped.emplace_back (value_ranget{make_single_value_range (op)});
631
+ auto result = resolve_values (new_values);
632
+ return environment.add_object_context (result);
641
633
}
642
634
643
- return unwrapped;
644
- }
635
+ static abstract_object_pointert
636
+ resolve_values (const abstract_object_sett &new_values)
637
+ {
638
+ PRECONDITION (!new_values.empty ());
645
639
646
- static exprt rewrite_expression (
647
- const exprt &expr,
648
- const std::vector<abstract_object_pointert> &ops)
649
- {
650
- auto operands_expr = exprt::operandst{};
651
- for (auto v : ops)
652
- operands_expr.push_back (v->to_constant ());
653
- auto rewritten_expr = exprt (expr.id (), expr.type (), std::move (operands_expr));
654
- return rewritten_expr;
655
- }
640
+ auto unwrapped_values = unwrap_and_extract_values (new_values);
656
641
657
- static abstract_object_pointert
658
- maybe_unwrap_context (const abstract_object_pointert &maybe_wrapped)
659
- {
660
- auto const &context_value =
661
- std::dynamic_pointer_cast<const context_abstract_objectt>(maybe_wrapped);
642
+ if (unwrapped_values.size () > value_set_abstract_objectt::max_value_set_size)
643
+ return unwrapped_values.to_interval ();
662
644
663
- return context_value ? context_value->unwrap_context () : maybe_wrapped;
664
- }
665
-
666
- static abstract_object_sett
667
- unwrap_and_extract_values (const abstract_object_sett &values)
668
- {
669
- abstract_object_sett unwrapped_values;
670
- for (auto const &value : values)
671
- {
672
- unwrapped_values.insert (
673
- maybe_extract_single_value (maybe_unwrap_context (value)));
645
+ const auto &type = new_values.first ()->type ();
646
+ auto result = std::make_shared<value_set_abstract_objectt>(type);
647
+ result->set_values (unwrapped_values);
648
+ return result;
674
649
}
675
650
676
- return unwrapped_values;
677
- }
678
-
679
- static abstract_object_pointert
680
- maybe_extract_single_value (const abstract_object_pointert &maybe_singleton)
681
- {
682
- auto const &value_as_set =
683
- std::dynamic_pointer_cast<const value_set_tag>(maybe_singleton);
684
- if (value_as_set)
651
+ abstract_object_pointert
652
+ value_set_evaluate_conditional (const std::vector<value_ranget> &ops) const
685
653
{
686
- PRECONDITION (value_as_set->get_values ().size () == 1 );
687
- PRECONDITION (!std::dynamic_pointer_cast<const context_abstract_objectt>(
688
- value_as_set->get_values ().first ()));
654
+ auto const &condition = ops[0 ];
655
+
656
+ auto const &true_result = ops[1 ];
657
+ auto const &false_result = ops[2 ];
689
658
690
- return value_as_set->get_values ().first ();
659
+ auto all_true = true ;
660
+ auto all_false = true ;
661
+ for (const auto &v : condition)
662
+ {
663
+ auto expr = v->to_constant ();
664
+ all_true = all_true && expr.is_true ();
665
+ all_false = all_false && expr.is_false ();
666
+ }
667
+ auto indeterminate = !all_true && !all_false;
668
+
669
+ abstract_object_sett resulting_objects;
670
+ if (all_true || indeterminate)
671
+ resulting_objects.insert (true_result);
672
+ if (all_false || indeterminate)
673
+ resulting_objects.insert (false_result);
674
+ return resolve_new_values (resulting_objects);
691
675
}
692
- else
693
- return maybe_singleton;
694
- }
695
676
696
- static abstract_object_pointert resolve_new_values (
697
- const abstract_object_sett &new_values,
698
- const abstract_environmentt &environment)
677
+ const exprt &expression;
678
+ const std::vector<abstract_object_pointert> &operands;
679
+ const abstract_environmentt &environment;
680
+ const namespacet &ns;
681
+ };
682
+
683
+ static abstract_object_pointert value_set_expression_transform (
684
+ const exprt &expr,
685
+ const std::vector<abstract_object_pointert> &operands,
686
+ const abstract_environmentt &environment,
687
+ const namespacet &ns)
699
688
{
700
- auto result = resolve_values (new_values );
701
- return environment. add_object_context (result );
689
+ auto evaluator = value_set_evaluator (expr, operands, environment, ns );
690
+ return evaluator ( );
702
691
}
703
692
704
- static abstract_object_pointert
705
- resolve_values (const abstract_object_sett &new_values)
693
+ static exprt rewrite_expression (
694
+ const exprt &expr,
695
+ const std::vector<abstract_object_pointert> &ops)
706
696
{
707
- PRECONDITION (!new_values.empty ());
708
-
709
- auto unwrapped_values = unwrap_and_extract_values (new_values);
710
-
711
- if (unwrapped_values.size () > value_set_abstract_objectt::max_value_set_size)
712
- return unwrapped_values.to_interval ();
713
-
714
- const auto &type = new_values.first ()->type ();
715
- auto result = std::make_shared<value_set_abstract_objectt>(type);
716
- result->set_values (unwrapped_values);
717
- return result;
697
+ auto operands_expr = exprt::operandst{};
698
+ for (auto v : ops)
699
+ operands_expr.push_back (v->to_constant ());
700
+ auto rewritten_expr = exprt (expr.id (), expr.type (), std::move (operands_expr));
701
+ return rewritten_expr;
718
702
}
0 commit comments