cached_shortest_sequences.cc 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include "cached_shortest_sequences.h"
  2. #include "find_shortest_sequences.h"
  3. #include "try_split_sequence.h"
  4. #include "segmented_sequences.h"
  5. #include <iostream>
  6. std::shared_ptr<SegmentedSequences> CachedShortestSequences::Find(
  7. std::string_view code,
  8. std::function<std::optional<char>(char, char)> apply_cmd) {
  9. std::string cache_key(code.data(), code.size());
  10. auto cache_iter = cache_.find(cache_key);
  11. if (cache_iter != cache_.end()) {
  12. return cache_iter->second;
  13. }
  14. auto maybe_split = TrySplitSequence(code);
  15. if (!maybe_split) {
  16. auto result_strs = FindShortestSequences(code, apply_cmd);
  17. std::vector<std::shared_ptr<SegmentedSequences>> segmented_sequences_leaves;
  18. for (auto &result_str : result_strs) {
  19. segmented_sequences_leaves.emplace_back(
  20. std::make_shared<SegmentedSequencesLeaf>(
  21. std::make_shared<std::string>(std::move(result_str))));
  22. }
  23. auto segmented_sequences_alts =
  24. std::make_shared<SegmentedSequencesAlternatives>(
  25. segmented_sequences_leaves);
  26. cache_.emplace(cache_key, segmented_sequences_alts);
  27. return segmented_sequences_alts;
  28. }
  29. auto segmented_sequences_product =
  30. std::make_shared<SegmentedSequencesProduct>(
  31. Find(maybe_split->first, apply_cmd),
  32. Find(maybe_split->second, apply_cmd));
  33. cache_.emplace(cache_key, segmented_sequences_product);
  34. return segmented_sequences_product;
  35. }
  36. std::shared_ptr<SegmentedSequences> CachedShortestSequences::Find(
  37. std::shared_ptr<SegmentedSequences> codes,
  38. std::function<std::optional<char>(char, char)> apply_cmd) {
  39. auto segmented_cache_iter = segmented_cache_.find(codes.get());
  40. if (segmented_cache_iter != segmented_cache_.end()) {
  41. return segmented_cache_iter->second;
  42. }
  43. auto leaf = std::dynamic_pointer_cast<SegmentedSequencesLeaf>(codes);
  44. if (leaf != nullptr) {
  45. auto leaf_result = Find(leaf->sequence(), apply_cmd);
  46. segmented_cache_.emplace(codes.get(), leaf_result);
  47. return leaf_result;
  48. }
  49. auto alts = std::dynamic_pointer_cast<SegmentedSequencesAlternatives>(codes);
  50. if (alts != nullptr) {
  51. std::vector<std::shared_ptr<SegmentedSequences>> alts_results;
  52. for (auto alt : alts->alternatives()) {
  53. alts_results.emplace_back(Find(alt, apply_cmd));
  54. }
  55. auto alt_result = std::make_shared<SegmentedSequencesAlternatives>(
  56. std::move(alts_results));
  57. segmented_cache_.emplace(codes.get(), alt_result);
  58. return alt_result;
  59. }
  60. auto product = std::dynamic_pointer_cast<SegmentedSequencesProduct>(codes);
  61. if (product != nullptr) {
  62. auto product_result = std::make_shared<SegmentedSequencesProduct>(
  63. Find(product->a(), apply_cmd), Find(product->b(), apply_cmd));
  64. segmented_cache_.emplace(codes.get(), product_result);
  65. return product_result;
  66. }
  67. return nullptr;
  68. }