From 821fb909a3007f697ad96d83c6b8e8cc70df0b6b Mon Sep 17 00:00:00 2001 From: zxu Date: Thu, 25 Jan 2018 13:05:30 -0500 Subject: implement `TargetIdGenerator` in C++ for Firestore (#701) * implement `TargetIdGenerator` * address changes --- .../src/firebase/firestore/core/CMakeLists.txt | 20 ++++++ .../firebase/firestore/core/target_id_generator.cc | 62 +++++++++++++++++ .../firebase/firestore/core/target_id_generator.h | 80 ++++++++++++++++++++++ Firestore/core/src/firebase/firestore/core/types.h | 32 +++++++++ 4 files changed, 194 insertions(+) create mode 100644 Firestore/core/src/firebase/firestore/core/CMakeLists.txt create mode 100644 Firestore/core/src/firebase/firestore/core/target_id_generator.cc create mode 100644 Firestore/core/src/firebase/firestore/core/target_id_generator.h create mode 100644 Firestore/core/src/firebase/firestore/core/types.h (limited to 'Firestore/core/src/firebase/firestore/core') diff --git a/Firestore/core/src/firebase/firestore/core/CMakeLists.txt b/Firestore/core/src/firebase/firestore/core/CMakeLists.txt new file mode 100644 index 0000000..a62985c --- /dev/null +++ b/Firestore/core/src/firebase/firestore/core/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright 2018 Google +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +cc_library( + firebase_firestore_core + SOURCES + target_id_generator.cc + target_id_generator.h +) diff --git a/Firestore/core/src/firebase/firestore/core/target_id_generator.cc b/Firestore/core/src/firebase/firestore/core/target_id_generator.cc new file mode 100644 index 0000000..6d23d64 --- /dev/null +++ b/Firestore/core/src/firebase/firestore/core/target_id_generator.cc @@ -0,0 +1,62 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Firestore/core/src/firebase/firestore/core/target_id_generator.h" + +namespace firebase { +namespace firestore { +namespace core { + +TargetIdGenerator::TargetIdGenerator(const TargetIdGenerator& value) + : generator_id_(value.generator_id_), previous_id_(value.previous_id_) { +} + +TargetIdGenerator::TargetIdGenerator(TargetIdGeneratorId generator_id, + TargetId after) + : generator_id_(generator_id) { + const TargetId after_without_generator = (after >> kReservedBits) + << kReservedBits; + const TargetId after_generator = after - after_without_generator; + const TargetId generator = static_cast(generator_id); + if (after_generator >= generator) { + // For example, if: + // self.generatorID = 0b0000 + // after = 0b1011 + // afterGenerator = 0b0001 + // Then: + // previous = 0b1010 + // next = 0b1100 + previous_id_ = after_without_generator | generator; + } else { + // For example, if: + // self.generatorID = 0b0001 + // after = 0b1010 + // afterGenerator = 0b0000 + // Then: + // previous = 0b1001 + // next = 0b1011 + previous_id_ = (after_without_generator | generator) - (1 << kReservedBits); + } +} + +TargetId TargetIdGenerator::NextId() { + previous_id_ += 1 << kReservedBits; + return previous_id_; +} + +} // namespace core +} // namespace firestore +} // namespace firebase diff --git a/Firestore/core/src/firebase/firestore/core/target_id_generator.h b/Firestore/core/src/firebase/firestore/core/target_id_generator.h new file mode 100644 index 0000000..345f141 --- /dev/null +++ b/Firestore/core/src/firebase/firestore/core/target_id_generator.h @@ -0,0 +1,80 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_CORE_TARGET_ID_GENERATOR_H_ +#define FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_CORE_TARGET_ID_GENERATOR_H_ + +#include "Firestore/core/src/firebase/firestore/core/types.h" + +namespace firebase { +namespace firestore { +namespace core { + +/** The set of all valid generators. */ +enum class TargetIdGeneratorId { LocalStore = 0, SyncEngine = 1 }; + +/** + * Generates monotonically increasing integer IDs. There are separate generators + * for different scopes. While these generators will operate independently of + * each other, they are scoped, such that no two generators will ever produce + * the same ID. This is useful, because sometimes the backend may group IDs from + * separate parts of the client into the same ID space. + * + * Not thread-safe. + */ +class TargetIdGenerator { + public: + TargetIdGenerator(const TargetIdGenerator& value); + + /** + * Creates and returns the TargetIdGenerator for the local store. + * + * @param after An ID to start at. Every call to NextId returns a larger id. + * @return An instance of TargetIdGenerator. + */ + static TargetIdGenerator LocalStoreTargetIdGenerator(TargetId after) { + return TargetIdGenerator(TargetIdGeneratorId::LocalStore, after); + } + + /** + * Creates and returns the TargetIdGenerator for the sync engine. + * + * @param after An ID to start at. Every call to NextId returns a larger id. + * @return An instance of TargetIdGenerator. + */ + static TargetIdGenerator SyncEngineTargetIdGenerator(TargetId after) { + return TargetIdGenerator(TargetIdGeneratorId::SyncEngine, after); + } + + TargetIdGeneratorId generator_id() { + return generator_id_; + } + + TargetId NextId(); + + private: + TargetIdGenerator(TargetIdGeneratorId generator_id, TargetId after); + TargetIdGeneratorId generator_id_; + TargetId previous_id_; + + static const int kReservedBits = 1; +}; + +} // namespace core +} // namespace firestore +} // namespace firebase + +#endif // FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_CORE_TARGET_ID_GENERATOR_H_ diff --git a/Firestore/core/src/firebase/firestore/core/types.h b/Firestore/core/src/firebase/firestore/core/types.h new file mode 100644 index 0000000..65c2b8c --- /dev/null +++ b/Firestore/core/src/firebase/firestore/core/types.h @@ -0,0 +1,32 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_CORE_TYPES_H_ +#define FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_CORE_TYPES_H_ + +#include + +namespace firebase { +namespace firestore { +namespace core { + +typedef int32_t TargetId; + +} // namespace core +} // namespace firestore +} // namespace firebase + +#endif // FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_CORE_TYPES_H_ -- cgit v1.2.3