132 lines
4.2 KiB
C++
132 lines
4.2 KiB
C++
/* ----------------------------------------------------------------------------
|
|
|
|
* GTSAM Copyright 2010, Georgia Tech Research Corporation,
|
|
* Atlanta, Georgia 30332-0415
|
|
* All Rights Reserved
|
|
* Authors: Frank Dellaert, et al. (see THANKS for the full author list)
|
|
|
|
* See LICENSE for the license information
|
|
|
|
* -------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* @file Key.h
|
|
* @brief
|
|
* @author Richard Roberts
|
|
* @date Feb 20, 2012
|
|
*/
|
|
#pragma once
|
|
|
|
#include <gtsam/base/FastList.h>
|
|
#include <gtsam/base/FastMap.h>
|
|
#include <gtsam/base/FastSet.h>
|
|
#include <gtsam/base/FastVector.h>
|
|
#include <gtsam/base/Testable.h>
|
|
#include <gtsam/base/types.h>
|
|
#include <gtsam/dllexport.h>
|
|
|
|
#include <functional>
|
|
|
|
#include <iosfwd>
|
|
|
|
namespace gtsam {
|
|
|
|
/// Typedef for a function to format a key, i.e. to convert it to a string
|
|
using KeyFormatter = std::function<std::string(Key)>;
|
|
|
|
// Helper function for DefaultKeyFormatter
|
|
GTSAM_EXPORT std::string _defaultKeyFormatter(Key key);
|
|
|
|
/**
|
|
* The default KeyFormatter, which is used if no KeyFormatter is passed
|
|
* to a 'print' function.
|
|
*
|
|
* Automatically detects plain integer keys and Symbol keys.
|
|
*
|
|
* Marked as `extern` so that it can be updated by external libraries.
|
|
*
|
|
*/
|
|
extern GTSAM_EXPORT KeyFormatter DefaultKeyFormatter;
|
|
|
|
// Helper function for Multi-robot Key Formatter
|
|
GTSAM_EXPORT std::string _multirobotKeyFormatter(gtsam::Key key);
|
|
|
|
///
|
|
/// A KeyFormatter that will check for LabeledSymbol keys, as well as Symbol and plain
|
|
/// integer keys. This keyformatter will need to be passed in to override the default
|
|
/// formatter in print functions.
|
|
///
|
|
/// Checks for LabeledSymbol, Symbol and then plain keys, in order.
|
|
extern GTSAM_EXPORT KeyFormatter MultiRobotKeyFormatter;
|
|
|
|
/// To use the key_formatter on Keys, they must be wrapped in a StreamedKey.
|
|
struct StreamedKey {
|
|
const Key &key_;
|
|
explicit StreamedKey(const Key &key) : key_(key) {}
|
|
GTSAM_EXPORT friend std::ostream &operator<<(std::ostream &, const StreamedKey &);
|
|
};
|
|
|
|
/**
|
|
* Output stream manipulator that will format gtsam::Keys according to the given
|
|
* KeyFormatter, as long as Key values are wrapped in a gtsam::StreamedKey.
|
|
* LabeledSymbol and Symbol values do not have to be wrapped.
|
|
* usage:
|
|
* Key key = LabeledSymbol('x', 'A', 5); // cast to key type
|
|
* cout << key_formatter(MultiRobotKeyFormatter) << StreamedKey(key);
|
|
*/
|
|
class key_formatter {
|
|
public:
|
|
explicit key_formatter(KeyFormatter v) : formatter_(v) {}
|
|
GTSAM_EXPORT friend std::ostream &operator<<(std::ostream &, const key_formatter &);
|
|
GTSAM_EXPORT friend std::ostream &operator<<(std::ostream &, const StreamedKey &);
|
|
|
|
private:
|
|
KeyFormatter formatter_;
|
|
static void *&property(std::ios_base &s);
|
|
static void set_property(std::ios_base &s, const KeyFormatter &f);
|
|
static KeyFormatter *get_property(std::ios_base &s);
|
|
};
|
|
|
|
/// Define collection type once and for all - also used in wrappers
|
|
using KeyVector = FastVector<Key>;
|
|
|
|
// TODO(frank): Nothing fast about these :-(
|
|
using KeyList = FastList<Key>;
|
|
using KeySet = FastSet<Key>;
|
|
using KeyGroupMap = FastMap<Key, int>;
|
|
|
|
/// Utility function to print one key with optional prefix
|
|
GTSAM_EXPORT void PrintKey(
|
|
Key key, const std::string &s = "",
|
|
const KeyFormatter &keyFormatter = DefaultKeyFormatter);
|
|
|
|
/// Utility function to print sets of keys with optional prefix
|
|
GTSAM_EXPORT void PrintKeyList(
|
|
const KeyList &keys, const std::string &s = "",
|
|
const KeyFormatter &keyFormatter = DefaultKeyFormatter);
|
|
|
|
/// Utility function to print sets of keys with optional prefix
|
|
GTSAM_EXPORT void PrintKeyVector(
|
|
const KeyVector &keys, const std::string &s = "",
|
|
const KeyFormatter &keyFormatter = DefaultKeyFormatter);
|
|
|
|
/// Utility function to print sets of keys with optional prefix
|
|
GTSAM_EXPORT void PrintKeySet(
|
|
const KeySet &keys, const std::string &s = "",
|
|
const KeyFormatter &keyFormatter = DefaultKeyFormatter);
|
|
|
|
// Define Key to be Testable by specializing gtsam::traits
|
|
template<typename T> struct traits;
|
|
|
|
template <>
|
|
struct traits<Key> {
|
|
static void Print(const Key& val, const std::string& str = "") {
|
|
PrintKey(val, str);
|
|
}
|
|
static bool Equals(const Key& val1, const Key& val2, double tol = 1e-8) {
|
|
return val1 == val2;
|
|
}
|
|
};
|
|
|
|
} // namespace gtsam
|