/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once namespace facebook { namespace butter { /* * `Butter` is a minimal collection of basic tools borrowed from other low-level * general purpose libraries (like Folly, Abseil or Boost). The main goals of * Butter: * - Make the codebase more portable; * - Make the dependency list explicit (by decoupling it as a dependency list of * Butter); * - Make relying on modern C++ patterns and tools in code simple and easy. * - Make executing experiments with different dependencies easier. * - Limit reliance on third-party libraries eventually. * * Target C++ Version * ------------------ * Currently, Butter targets C++17. * * The Scope * --------- * What should be part of Butter and what should not? Should I add some piece of * functionality in the Butter? Here is a quick checklist. * * As of now, Butter is relatively permissive per the guidance below: * * If one of the following is true, yes, go for it: * - If some feature is already in some future C++ standard (possibly in draft * stage) and it's already implemented in some 3rd party library. * - If some standardized feature of C++ is implemented in the standard not in * the most efficient way (because the standard enforces some tricky * constraints, like always-valid iterators, which nobody uses and should use), * but you have a library that does it right providing exact same interface. * * If one of the following is true, please do *NOT* do it (at least as part of * the library): * - You want to use some very fancy pattern that your favorite library (but * nothing else) provides, and You want to make this pattern very command in the * code base. Your hope is that this pattern will conquer the world and be * a part of the C++ standard eventually. * - You favorite library provides some general purpose container that 10x times * faster than the standard one, so You want to use that in the code base. That * container does not have compatible API though (because it's a clear trade-off * with efficiency, of course). * * Note that eventually Butter will restrict the API collection to reduce * reliance on non-standard C++ builtin libraries. That way, the API footprint * stays small and is limited to just the essential APIs. This restriction is * currently a work in progress. */ /* * Configuration */ /* * Enables using Folly containers instead of standard ones (such as map, vector, * small_vector, optional and etc.) * Custom containers are only enabled in release mode. Using custom stuff * complicates debugging process because it breaks embedded into IDE * introspections mechanisms. */ #ifndef DEBUG #define BUTTER_USE_FOLLY_CONTAINERS #endif } // namespace butter } // namespace facebook