Compare commits

...
Sign in to create a new pull request.

1 commit

Author SHA1 Message Date
Nicolas Cornu
5e25b3af78 Replace AtomicSharedPtr by std::atomic<std::shared_ptr<>>
Signed-off-by: Meenbeese <meenbeese@tutanota.com>
2024-12-24 22:54:08 -05:00
9 changed files with 62 additions and 98 deletions

View file

@ -9,7 +9,6 @@ set(SRC
../std/windows.hpp
array_adapters.hpp
assert.hpp
atomic_shared_ptr.hpp
base.cpp
base.hpp
beam.hpp

View file

@ -1,27 +0,0 @@
#pragma once
#include "base/macros.hpp"
#include <memory>
namespace base
{
// Template which provides methods for concurrently using shared pointers.
template <typename T>
class AtomicSharedPtr final
{
public:
using ContentType = T const;
using ValueType = std::shared_ptr<ContentType>;
AtomicSharedPtr() = default;
void Set(ValueType value) noexcept { atomic_store(&m_wrapped, value); }
ValueType Get() const noexcept { return atomic_load(&m_wrapped); }
private:
ValueType m_wrapped = std::make_shared<ContentType>();
DISALLOW_COPY_AND_MOVE(AtomicSharedPtr);
};
} // namespace base

View file

@ -31,7 +31,7 @@ void Waiter::Interrupt()
m_event.notify_all();
}
ConfigLoader::ConfigLoader(base::AtomicSharedPtr<EditorConfig> & config) : m_config(config)
ConfigLoader::ConfigLoader(std::atomic<std::shared_ptr<EditorConfig>> & config) : m_config(config)
{
pugi::xml_document doc;
LoadFromLocal(doc);
@ -47,7 +47,7 @@ void ConfigLoader::ResetConfig(pugi::xml_document const & doc)
{
auto config = std::make_shared<EditorConfig>();
config->SetConfig(doc);
m_config.Set(config);
m_config.store(config);
}
// static

View file

@ -1,6 +1,5 @@
#pragma once
#include "base/atomic_shared_ptr.hpp"
#include "base/exception.hpp"
#include "base/logging.hpp"
@ -48,7 +47,7 @@ private:
class ConfigLoader
{
public:
explicit ConfigLoader(base::AtomicSharedPtr<EditorConfig> & config);
explicit ConfigLoader(std::atomic<std::shared_ptr<EditorConfig>> & config);
~ConfigLoader();
// Static methods for production and testing.
@ -57,7 +56,7 @@ public:
private:
void ResetConfig(pugi::xml_document const & doc);
base::AtomicSharedPtr<EditorConfig> & m_config;
std::atomic<std::shared_ptr<EditorConfig>> & m_config;
Waiter m_waiter;
};

View file

@ -5,8 +5,6 @@
#include "platform/platform_tests_support/scoped_file.hpp"
#include "base/atomic_shared_ptr.hpp"
#include <pugixml.hpp>
namespace
@ -24,10 +22,10 @@ void CheckGeneralTags(pugi::xml_document const & doc)
UNIT_TEST(ConfigLoader_Base)
{
base::AtomicSharedPtr<EditorConfig> config;
std::atomic<std::shared_ptr<EditorConfig>> config;
ConfigLoader loader(config);
TEST(!config.Get()->GetTypesThatCanBeAdded().empty(), ());
TEST(!config.load()->GetTypesThatCanBeAdded().empty(), ());
}
// This functionality is not used and corresponding server is not working.

View file

@ -228,7 +228,7 @@ void EditorTest::GetFeatureTypeInfoTest()
{
MwmSet::MwmId mwmId;
TEST(!editor.GetFeatureTypeInfo((*editor.m_features.Get()), mwmId, 0), ());
TEST(!editor.GetFeatureTypeInfo((*editor.m_features.load()), mwmId, 0), ());
}
auto const mwmId = ConstructTestMwm([](TestMwmBuilder & builder)
@ -239,12 +239,12 @@ void EditorTest::GetFeatureTypeInfoTest()
ForEachCafeAtPoint(m_dataSource, m2::PointD(1.0, 1.0), [&editor](FeatureType & ft)
{
auto const featuresBefore = editor.m_features.Get();
auto const featuresBefore = editor.m_features.load();
TEST(!editor.GetFeatureTypeInfo(*featuresBefore, ft.GetID().m_mwmId, ft.GetID().m_index), ());
SetBuildingLevelsToOne(ft);
auto const featuresAfter = editor.m_features.Get();
auto const featuresAfter = editor.m_features.load();
auto const fti = editor.GetFeatureTypeInfo(*featuresAfter, ft.GetID().m_mwmId, ft.GetID().m_index);
TEST_NOT_EQUAL(fti, nullptr, ());
TEST_EQUAL(fti->m_object.GetID(), ft.GetID(), ());
@ -502,9 +502,9 @@ void EditorTest::ClearAllLocalEditsTest()
osm::EditableMapObject emo;
CreateCafeAtPoint({3.0, 3.0}, mwmId, emo);
TEST(!editor.m_features.Get()->empty(), ());
TEST(!editor.m_features.load()->empty(), ());
editor.ClearAllLocalEdits();
TEST(editor.m_features.Get()->empty(), ());
TEST(editor.m_features.load()->empty(), ());
}
void EditorTest::GetFeaturesByStatusTest()
@ -607,7 +607,7 @@ void EditorTest::OnMapDeregisteredTest()
SetBuildingLevelsToOne(ft);
});
TEST_EQUAL(editor.m_features.Get()->size(), 2, (editor.m_features.Get()->size()));
TEST_EQUAL(editor.m_features.load()->size(), 2, (editor.m_features.load()->size()));
{
platform::tests_support::AsyncGuiThread guiThread;
@ -616,7 +616,7 @@ void EditorTest::OnMapDeregisteredTest()
// The map is deregistered but the edits are not deleted until
// LoadEdits() is called again, either on the next startup or
// on registering a new map.
TEST_EQUAL(editor.m_features.Get()->size(), 2, ());
TEST_EQUAL(editor.m_features.load()->size(), 2, ());
{
platform::tests_support::AsyncGuiThread guiThread;
@ -626,13 +626,13 @@ void EditorTest::OnMapDeregisteredTest()
TEST(gbMwmId.IsAlive(), ());
}
// The same map was registered: the edits are still here.
TEST_EQUAL(editor.m_features.Get()->size(), 2, ());
TEST_EQUAL(editor.m_features.load()->size(), 2, ());
{
platform::tests_support::AsyncGuiThread guiThread;
m_dataSource.DeregisterMap(gbMwmId.GetInfo()->GetLocalFile().GetCountryFile());
}
TEST_EQUAL(editor.m_features.Get()->size(), 2, ());
TEST_EQUAL(editor.m_features.load()->size(), 2, ());
{
platform::tests_support::AsyncGuiThread guiThread;
@ -643,9 +643,9 @@ void EditorTest::OnMapDeregisteredTest()
}
// Another map was registered: all edits are reloaded and
// the edits for the deleted map are removed.
TEST_EQUAL(editor.m_features.Get()->size(), 1, ());
auto const editedMwmId = editor.m_features.Get()->find(rfMwmId);
bool const result = (editedMwmId != editor.m_features.Get()->end());
TEST_EQUAL(editor.m_features.load()->size(), 1, ());
auto const editedMwmId = editor.m_features.load()->find(rfMwmId);
bool const result = (editedMwmId != editor.m_features.load()->end());
TEST(result, ());
}
@ -1015,13 +1015,13 @@ void EditorTest::LoadMapEditsTest()
CreateCafeAtPoint({5.0, 5.0}, rfMwmId, emo);
features.emplace_back(emo.GetID());
editor.Save((*editor.m_features.Get()));
editor.Save((*editor.m_features.load()));
editor.LoadEdits();
auto const fillLoaded = [&editor](std::vector<FeatureID> & loadedFeatures)
{
loadedFeatures.clear();
for (auto const & mwm : *(editor.m_features.Get()))
for (auto const & mwm : *(editor.m_features.load()))
{
for (auto const & index : mwm.second)
{
@ -1056,12 +1056,12 @@ void EditorTest::LoadMapEditsTest()
m_dataSource.DeregisterMap(m_mwmFiles.back().GetCountryFile());
TEST(RemoveMwm(newRfMwmId), ());
TEST_EQUAL(editor.m_features.Get()->size(), 2, ());
TEST_EQUAL(editor.m_features.load()->size(), 2, ());
editor.LoadEdits();
fillLoaded(loadedFeatures);
TEST_EQUAL(editor.m_features.Get()->size(), 1, ());
TEST_EQUAL(editor.m_features.load()->size(), 1, ());
TEST_EQUAL(loadedFeatures.size(), 2, ());
osm::EditableMapObject gbEmo;
@ -1073,7 +1073,7 @@ void EditorTest::LoadMapEditsTest()
editor.LoadEdits();
fillLoaded(loadedFeatures);
TEST_EQUAL(editor.m_features.Get()->size(), 1, ());
TEST_EQUAL(editor.m_features.load()->size(), 1, ());
TEST_EQUAL(loadedFeatures.size(), 1, ());
m_dataSource.DeregisterMap(m_mwmFiles.back().GetCountryFile());
@ -1088,7 +1088,7 @@ void EditorTest::LoadMapEditsTest()
newGbMwmId.GetInfo()->m_version.SetSecondsSinceEpoch(time(nullptr) + 1);
editor.LoadEdits();
TEST(editor.m_features.Get()->empty(), ());
TEST(editor.m_features.load()->empty(), ());
}
void EditorTest::SaveEditedFeatureTest()
@ -1157,7 +1157,7 @@ void EditorTest::SaveTransactionTest()
SetBuildingLevelsToOne(ft);
});
auto const features = editor.m_features.Get();
auto const features = editor.m_features.load();
TEST_EQUAL(features->size(), 2, ());
TEST_EQUAL(features->begin()->second.size(), 1, ());
@ -1181,7 +1181,7 @@ void EditorTest::SaveTransactionTest()
TEST_EQUAL(saveResult, osm::Editor::SaveResult::NoFreeSpaceError, ());
auto const features = editor.m_features.Get();
auto const features = editor.m_features.load();
auto const mwmIt = features->find(mwmId);
TEST(mwmIt != features->end(), ());
@ -1204,7 +1204,7 @@ void EditorTest::SaveTransactionTest()
TEST_EQUAL(saveResult, osm::Editor::SaveResult::SavingError, ());
auto const features = editor.m_features.Get();
auto const features = editor.m_features.load();
auto const mwmIt = features->find(mwmId);
TEST(mwmIt != features->end(), ());
@ -1220,7 +1220,7 @@ void EditorTest::SaveTransactionTest()
editor.DeleteFeature(ft.GetID());
});
auto const features = editor.m_features.Get();
auto const features = editor.m_features.load();
auto const mwmIt = features->find(mwmId);
TEST(mwmIt != features->end(), ());
@ -1236,7 +1236,7 @@ void EditorTest::SaveTransactionTest()
editor.MarkFeatureAsObsolete(ft.GetID());
});
auto const features = editor.m_features.Get();
auto const features = editor.m_features.load();
auto const mwmIt = features->find(mwmId);
TEST(mwmIt != features->end(), ());
@ -1258,7 +1258,7 @@ void EditorTest::SaveTransactionTest()
TEST_EQUAL(editor.m_notes->NotUploadedNotesCount(), 0, ());
auto const features = editor.m_features.Get();
auto const features = editor.m_features.load();
auto const mwmIt = features->find(mwmId);
TEST(mwmIt != features->end(), ());
@ -1274,7 +1274,7 @@ void EditorTest::SaveTransactionTest()
editor.RollBackChanges(ft.GetID());
});
auto const features = editor.m_features.Get();
auto const features = editor.m_features.load();
auto const mwmIt = features->find(mwmId);
TEST(mwmIt != features->end(), ());
@ -1286,7 +1286,7 @@ void EditorTest::SaveTransactionTest()
{
editor.ClearAllLocalEdits();
TEST_EQUAL(editor.m_features.Get()->size(), 2, ());
TEST_EQUAL(editor.m_features.load()->size(), 2, ());
}
{
@ -1295,7 +1295,7 @@ void EditorTest::SaveTransactionTest()
editor.OnMapDeregistered(mwmId.GetInfo()->GetLocalFile());
}
auto const features = editor.m_features.Get();
auto const features = editor.m_features.load();
auto const mwmIt = features->find(mwmId);
TEST(mwmIt != features->end(), ());
@ -1308,7 +1308,7 @@ void EditorTest::SaveTransactionTest()
optionalSaveStorage.AllowSave(true);
editor.ClearAllLocalEdits();
TEST(editor.m_features.Get()->empty(), ());
TEST(editor.m_features.load()->empty(), ());
}
void EditorTest::Cleanup(platform::LocalCountryFile const & map)
@ -1363,7 +1363,7 @@ void EditorTest::LoadExistingEditsXml()
editor.SetStorageForTesting(std::move(memStorage));
editor.LoadEdits();
TEST_EQUAL(editor.m_features.Get()->size(), 1, ());
TEST_EQUAL(editor.m_features.load()->size(), 1, ());
}
} // namespace testing

View file

@ -164,7 +164,7 @@ void Editor::LoadEdits()
if (!m_storage->Load(doc))
return;
m_features.Set(make_shared<FeaturesContainer>());
m_features.store(make_shared<FeaturesContainer>());
auto loadedFeatures = make_shared<FeaturesContainer>();
auto rootNode = doc.child(kXmlRootNode);
@ -196,7 +196,7 @@ void Editor::LoadEdits()
if (needRewriteEdits)
SaveTransaction(loadedFeatures);
else
m_features.Set(loadedFeatures);
m_features.store(loadedFeatures);
}
bool Editor::Save(FeaturesContainer const & features) const
@ -259,7 +259,7 @@ bool Editor::SaveTransaction(std::shared_ptr<FeaturesContainer> const & features
if (!Save(*features))
return false;
m_features.Set(features);
m_features.store(features);
return true;
}
@ -279,19 +279,19 @@ void Editor::OnMapRegistered(platform::LocalCountryFile const &)
FeatureStatus Editor::GetFeatureStatus(MwmId const & mwmId, uint32_t index) const
{
auto const features = m_features.Get();
auto const features = m_features.load();
return GetFeatureStatusImpl(*features, mwmId, index);
}
FeatureStatus Editor::GetFeatureStatus(FeatureID const & fid) const
{
auto const features = m_features.Get();
auto const features = m_features.load();
return GetFeatureStatusImpl(*features, fid.m_mwmId, fid.m_index);
}
bool Editor::IsFeatureUploaded(MwmId const & mwmId, uint32_t index) const
{
auto const features = m_features.Get();
auto const features = m_features.load();
return IsFeatureUploadedImpl(*features, mwmId, index);
}
@ -299,7 +299,7 @@ void Editor::DeleteFeature(FeatureID const & fid)
{
CHECK_THREAD_CHECKER(MainThreadChecker, (""));
auto const features = m_features.Get();
auto const features = m_features.load();
auto editableFeatures = make_shared<FeaturesContainer>(*features);
auto const mwm = editableFeatures->find(fid.m_mwmId);
@ -346,7 +346,7 @@ Editor::SaveResult Editor::SaveEditedFeature(EditableMapObject const & emo)
FeatureID const & fid = emo.GetID();
FeatureTypeInfo fti;
auto const features = m_features.Get();
auto const features = m_features.load();
auto const featureStatus = GetFeatureStatusImpl(*features, fid.m_mwmId, fid.m_index);
ASSERT_NOT_EQUAL(featureStatus, FeatureStatus::Obsolete, ("Obsolete feature cannot be modified."));
@ -445,7 +445,7 @@ bool Editor::RollBackChanges(FeatureID const & fid)
void Editor::ForEachCreatedFeature(MwmId const & id, FeatureIndexFunctor const & f,
m2::RectD const & rect, int /*scale*/) const
{
auto const features = m_features.Get();
auto const features = m_features.load();
auto const mwmFound = features->find(id);
if (mwmFound == features->cend())
@ -465,7 +465,7 @@ void Editor::ForEachCreatedFeature(MwmId const & id, FeatureIndexFunctor const &
std::optional<osm::EditableMapObject> Editor::GetEditedFeature(FeatureID const & fid) const
{
auto const features = m_features.Get();
auto const features = m_features.load();
auto const * featureInfo = GetFeatureTypeInfo(*features, fid.m_mwmId, fid.m_index);
if (featureInfo == nullptr)
return {};
@ -475,7 +475,7 @@ std::optional<osm::EditableMapObject> Editor::GetEditedFeature(FeatureID const &
bool Editor::GetEditedFeatureStreet(FeatureID const & fid, string & outFeatureStreet) const
{
auto const features = m_features.Get();
auto const features = m_features.load();
auto const * featureInfo = GetFeatureTypeInfo(*features, fid.m_mwmId, fid.m_index);
if (featureInfo == nullptr)
return false;
@ -487,7 +487,7 @@ bool Editor::GetEditedFeatureStreet(FeatureID const & fid, string & outFeatureSt
std::vector<uint32_t> Editor::GetFeaturesByStatus(MwmId const & mwmId,
FeatureStatus status) const
{
auto const features = m_features.Get();
auto const features = m_features.load();
std::vector<uint32_t> result;
auto const matchedMwm = features->find(mwmId);
@ -505,7 +505,7 @@ std::vector<uint32_t> Editor::GetFeaturesByStatus(MwmId const & mwmId,
EditableProperties Editor::GetEditableProperties(FeatureType & feature) const
{
auto const features = m_features.Get();
auto const features = m_features.load();
auto const & fid = feature.GetID();
auto const featureStatus = GetFeatureStatusImpl(*features, fid.m_mwmId, fid.m_index);
@ -542,7 +542,7 @@ EditableProperties Editor::GetEditableProperties(FeatureType & feature) const
EditableProperties Editor::GetEditablePropertiesForTypes(feature::TypesHolder const & types) const
{
editor::TypeAggregatedDescription desc;
if (m_config.Get()->GetTypeDescription(types.ToObjectNames(), desc))
if (m_config.load()->GetTypeDescription(types.ToObjectNames(), desc))
{
return { std::move(desc.m_editableFields), desc.IsNameEditable(),
desc.IsAddressEditable(), desc.IsCuisineEditable() };
@ -555,7 +555,7 @@ bool Editor::HaveMapEditsOrNotesToUpload() const
if (m_notes->NotUploadedNotesCount() != 0)
return true;
auto const features = m_features.Get();
auto const features = m_features.load();
return HaveMapEditsToUpload(*features);
}
@ -564,7 +564,7 @@ bool Editor::HaveMapEditsToUpload(MwmId const & mwmId) const
if (!mwmId.IsAlive())
return false;
auto const features = m_features.Get();
auto const features = m_features.load();
auto const found = features->find(mwmId);
if (found != features->cend())
@ -584,7 +584,7 @@ void Editor::UploadChanges(string const & oauthToken, ChangesetTags tags,
if (m_notes->NotUploadedNotesCount())
m_notes->Upload(OsmOAuth::ServerAuth(oauthToken));
auto const features = m_features.Get();
auto const features = m_features.load();
if (!HaveMapEditsToUpload(*features))
{
@ -596,7 +596,7 @@ void Editor::UploadChanges(string const & oauthToken, ChangesetTags tags,
{
int uploadedFeaturesCount = 0, errorsCount = 0;
ChangesetWrapper changeset(secret, std::move(tags));
auto const features = m_features.Get();
auto const features = m_features.load();
for (auto const & id : *features)
{
@ -786,7 +786,7 @@ void Editor::SaveUploadedInformation(FeatureID const & fid, UploadInfo const & u
{
CHECK_THREAD_CHECKER(MainThreadChecker, (""));
auto const features = m_features.Get();
auto const features = m_features.load();
auto editableFeatures = make_shared<FeaturesContainer>(*features);
auto id = editableFeatures->find(fid.m_mwmId);
@ -860,7 +860,7 @@ bool Editor::RemoveFeatureIfExists(FeatureID const & fid)
{
CHECK_THREAD_CHECKER(MainThreadChecker, (""));
auto const features = m_features.Get();
auto const features = m_features.load();
auto editableFeatures = make_shared<FeaturesContainer>(*features);
auto matchedMwm = editableFeatures->find(fid.m_mwmId);
@ -887,7 +887,7 @@ bool Editor::MarkFeatureAsObsolete(FeatureID const & fid)
{
CHECK_THREAD_CHECKER(MainThreadChecker, (""));
auto const features = m_features.Get();
auto const features = m_features.load();
auto editableFeatures = make_shared<FeaturesContainer>(*features);
auto const featureStatus = GetFeatureStatusImpl(*editableFeatures, fid.m_mwmId, fid.m_index);
@ -921,7 +921,7 @@ Editor::Stats Editor::GetStats() const
Stats stats;
LOG(LDEBUG, ("Edited features status:"));
auto const features = m_features.Get();
auto const features = m_features.load();
for (auto const & id : *features)
{
for (auto & index : id.second)
@ -947,7 +947,7 @@ Editor::Stats Editor::GetStats() const
NewFeatureCategories Editor::GetNewFeatureCategories() const
{
return NewFeatureCategories(*(m_config.Get()));
return NewFeatureCategories(*(m_config.load()));
}
FeatureID Editor::GenerateNewFeatureId(FeaturesContainer const & features,
@ -983,7 +983,7 @@ bool Editor::CreatePoint(uint32_t type, m2::PointD const & mercator, MwmId const
}
outFeature.SetMercator(mercator);
outFeature.SetID(GenerateNewFeatureId(*(m_features.Get()), id));
outFeature.SetID(GenerateNewFeatureId(*(m_features.load()), id));
outFeature.SetType(type);
outFeature.SetEditableProperties(GetEditablePropertiesForTypes(outFeature.GetTypes()));
// Only point type features can be created at the moment.
@ -1010,7 +1010,7 @@ void Editor::CreateNote(ms::LatLon const & latLon, FeatureID const & fid,
sstr << "The place has gone or never existed. A user of Organic Maps application has reported "
"that the POI was visible on the map (see snapshot date below), but was not found "
"on the ground.\n";
auto const features = m_features.Get();
auto const features = m_features.load();
auto const isCreated =
GetFeatureStatusImpl(*features, fid.m_mwmId, fid.m_index) == FeatureStatus::Created;
auto const createdAndUploaded =

View file

@ -14,7 +14,6 @@
#include "geometry/rect2d.hpp"
#include "base/atomic_shared_ptr.hpp"
#include "base/thread_checker.hpp"
#include "base/timer.hpp"
@ -236,7 +235,7 @@ private:
static bool IsFeatureUploadedImpl(FeaturesContainer const & features, MwmId const & mwmId, uint32_t index);
/// Deleted, edited and created features.
base::AtomicSharedPtr<FeaturesContainer> m_features;
std::atomic<std::shared_ptr<FeaturesContainer>> m_features;
std::unique_ptr<Delegate> m_delegate;
@ -244,7 +243,7 @@ private:
InvalidateFn m_invalidateFn;
/// Contains information about what and how can be edited.
base::AtomicSharedPtr<editor::EditorConfig> m_config;
std::atomic<std::shared_ptr<editor::EditorConfig>> m_config;
editor::ConfigLoader m_configLoader;
/// Notes to be sent to osm.

View file

@ -71,7 +71,6 @@
39FD27391CC65AD000AFF551 /* timer_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 39FD26E31CC65A0E00AFF551 /* timer_test.cpp */; };
39FD273B1CC65B1000AFF551 /* libbase.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675341771A3F57BF00A0A8C3 /* libbase.a */; };
3D08987924810A0B00837783 /* linked_map.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D08987824810A0B00837783 /* linked_map.hpp */; };
3D1BE646212D775500ACD94A /* atomic_shared_ptr.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D1BE645212D775500ACD94A /* atomic_shared_ptr.hpp */; };
3D74EF111F8B902C0081202C /* suffix_array.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D74EF0B1F8B902B0081202C /* suffix_array.cpp */; };
3D74EF121F8B902C0081202C /* visitor.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D74EF0C1F8B902B0081202C /* visitor.hpp */; };
3D7815731F3A145F0068B6AC /* task_loop.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D7815711F3A145F0068B6AC /* task_loop.hpp */; };
@ -216,7 +215,6 @@
39FD27071CC65A7100AFF551 /* base_tests.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = base_tests.app; sourceTree = BUILT_PRODUCTS_DIR; };
3D08987824810A0B00837783 /* linked_map.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = linked_map.hpp; sourceTree = "<group>"; };
3D08987A24810A1300837783 /* linked_map_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = linked_map_tests.cpp; sourceTree = "<group>"; };
3D1BE645212D775500ACD94A /* atomic_shared_ptr.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = atomic_shared_ptr.hpp; sourceTree = "<group>"; };
3D74EF0B1F8B902B0081202C /* suffix_array.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = suffix_array.cpp; sourceTree = "<group>"; };
3D74EF0C1F8B902B0081202C /* visitor.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = visitor.hpp; sourceTree = "<group>"; };
3D7815711F3A145F0068B6AC /* task_loop.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = task_loop.hpp; sourceTree = "<group>"; };
@ -403,7 +401,6 @@
children = (
675341851A3F57E400A0A8C3 /* array_adapters.hpp */,
675341861A3F57E400A0A8C3 /* assert.hpp */,
3D1BE645212D775500ACD94A /* atomic_shared_ptr.hpp */,
675341871A3F57E400A0A8C3 /* base.cpp */,
675341881A3F57E400A0A8C3 /* base.hpp */,
39F1E52E21C961A800D961DC /* beam.hpp */,
@ -535,7 +532,6 @@
3D7815731F3A145F0068B6AC /* task_loop.hpp in Headers */,
675341F51A3F57E400A0A8C3 /* set_operations.hpp in Headers */,
675342041A3F57E400A0A8C3 /* strings_bundle.hpp in Headers */,
3D1BE646212D775500ACD94A /* atomic_shared_ptr.hpp in Headers */,
672DD4C81E0425600078E13C /* stl_helpers.hpp in Headers */,
675341CE1A3F57E400A0A8C3 /* base.hpp in Headers */,
675341F41A3F57E400A0A8C3 /* scope_guard.hpp in Headers */,