| 1002 | |
| 1003 | private: |
| 1004 | internal::Ops CalcOps() const { |
| 1005 | switch (fragment) { |
| 1006 | case Fragment::JUST_1: return {0, 0, {}}; |
| 1007 | case Fragment::JUST_0: return {0, {}, 0}; |
| 1008 | case Fragment::PK_K: return {0, 0, 0}; |
| 1009 | case Fragment::PK_H: return {3, 0, 0}; |
| 1010 | case Fragment::OLDER: |
| 1011 | case Fragment::AFTER: return {1, 0, {}}; |
| 1012 | case Fragment::SHA256: |
| 1013 | case Fragment::RIPEMD160: |
| 1014 | case Fragment::HASH256: |
| 1015 | case Fragment::HASH160: return {4, 0, {}}; |
| 1016 | case Fragment::AND_V: return {subs[0].ops.count + subs[1].ops.count, subs[0].ops.sat + subs[1].ops.sat, {}}; |
| 1017 | case Fragment::AND_B: { |
| 1018 | const auto count{1 + subs[0].ops.count + subs[1].ops.count}; |
| 1019 | const auto sat{subs[0].ops.sat + subs[1].ops.sat}; |
| 1020 | const auto dsat{subs[0].ops.dsat + subs[1].ops.dsat}; |
| 1021 | return {count, sat, dsat}; |
| 1022 | } |
| 1023 | case Fragment::OR_B: { |
| 1024 | const auto count{1 + subs[0].ops.count + subs[1].ops.count}; |
| 1025 | const auto sat{(subs[0].ops.sat + subs[1].ops.dsat) | (subs[1].ops.sat + subs[0].ops.dsat)}; |
| 1026 | const auto dsat{subs[0].ops.dsat + subs[1].ops.dsat}; |
| 1027 | return {count, sat, dsat}; |
| 1028 | } |
| 1029 | case Fragment::OR_D: { |
| 1030 | const auto count{3 + subs[0].ops.count + subs[1].ops.count}; |
| 1031 | const auto sat{subs[0].ops.sat | (subs[1].ops.sat + subs[0].ops.dsat)}; |
| 1032 | const auto dsat{subs[0].ops.dsat + subs[1].ops.dsat}; |
| 1033 | return {count, sat, dsat}; |
| 1034 | } |
| 1035 | case Fragment::OR_C: { |
| 1036 | const auto count{2 + subs[0].ops.count + subs[1].ops.count}; |
| 1037 | const auto sat{subs[0].ops.sat | (subs[1].ops.sat + subs[0].ops.dsat)}; |
| 1038 | return {count, sat, {}}; |
| 1039 | } |
| 1040 | case Fragment::OR_I: { |
| 1041 | const auto count{3 + subs[0].ops.count + subs[1].ops.count}; |
| 1042 | const auto sat{subs[0].ops.sat | subs[1].ops.sat}; |
| 1043 | const auto dsat{subs[0].ops.dsat | subs[1].ops.dsat}; |
| 1044 | return {count, sat, dsat}; |
| 1045 | } |
| 1046 | case Fragment::ANDOR: { |
| 1047 | const auto count{3 + subs[0].ops.count + subs[1].ops.count + subs[2].ops.count}; |
| 1048 | const auto sat{(subs[1].ops.sat + subs[0].ops.sat) | (subs[0].ops.dsat + subs[2].ops.sat)}; |
| 1049 | const auto dsat{subs[0].ops.dsat + subs[2].ops.dsat}; |
| 1050 | return {count, sat, dsat}; |
| 1051 | } |
| 1052 | case Fragment::MULTI: return {1, (uint32_t)keys.size(), (uint32_t)keys.size()}; |
| 1053 | case Fragment::MULTI_A: return {(uint32_t)keys.size() + 1, 0, 0}; |
| 1054 | case Fragment::WRAP_S: |
| 1055 | case Fragment::WRAP_C: |
| 1056 | case Fragment::WRAP_N: return {1 + subs[0].ops.count, subs[0].ops.sat, subs[0].ops.dsat}; |
| 1057 | case Fragment::WRAP_A: return {2 + subs[0].ops.count, subs[0].ops.sat, subs[0].ops.dsat}; |
| 1058 | case Fragment::WRAP_D: return {3 + subs[0].ops.count, subs[0].ops.sat, 0}; |
| 1059 | case Fragment::WRAP_J: return {4 + subs[0].ops.count, subs[0].ops.sat, 0}; |
| 1060 | case Fragment::WRAP_V: return {subs[0].ops.count + (subs[0].GetType() << "x"_mst), subs[0].ops.sat, {}}; |
| 1061 | case Fragment::THRESH: { |