summaryrefslogtreecommitdiff
path: root/odb/pragma.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'odb/pragma.hxx')
-rw-r--r--odb/pragma.hxx287
1 files changed, 0 insertions, 287 deletions
diff --git a/odb/pragma.hxx b/odb/pragma.hxx
deleted file mode 100644
index 45b3528..0000000
--- a/odb/pragma.hxx
+++ /dev/null
@@ -1,287 +0,0 @@
-// file : odb/pragma.hxx
-// license : GNU GPL v3; see accompanying LICENSE file
-
-#ifndef ODB_PRAGMA_HXX
-#define ODB_PRAGMA_HXX
-
-#include <odb/gcc.hxx>
-
-#include <map>
-#include <set>
-#include <vector>
-#include <string>
-
-#include <odb/option-types.hxx> // database
-
-#include <cutl/container/any.hxx>
-#include <cutl/container/multi-index.hxx>
-#include <cutl/compiler/context.hxx>
-
-struct virt_declaration
-{
- virt_declaration (location_t l,
- location_t o,
- int ob,
- std::string const& n,
- gcc_tree_code_type tc,
- tree t)
- : loc (l), ord (o), ord_bias (ob), name (n), tree_code (tc), type (t) {}
-
- location_t loc;
- location_t ord; // Ordering location for before/after support.
- int ord_bias; // Ordering bias for the same locations.
- std::string name;
- gcc_tree_code_type tree_code;
- tree type; // Declaration's type.
-};
-
-// Note that we consider virtual declarations with the same name but
-// different tree codes unequal. If that is too loose, then the
-// inserting code must do additional checks.
-//
-struct virt_declaration_set
-{
- typedef cutl::container::key<std::string, gcc_tree_code_type> key;
- typedef std::map<key, virt_declaration> map;
- typedef cutl::container::map_const_iterator<map> const_iterator;
-
- std::pair<const_iterator, bool>
- insert (const virt_declaration& v)
- {
- std::pair<map::iterator, bool> r (
- map_.insert (map::value_type (key (v.name, v.tree_code), v)));
-
- const_iterator i (r.first);
-
- if (r.second)
- r.first->first.assign (i->name, i->tree_code);
-
- return std::make_pair (i, r.second);
- }
-
- const_iterator
- find (std::string const& name, gcc_tree_code_type tree_code) const
- {
- return map_.find (key (name, tree_code));
- }
-
- const_iterator begin () const {return map_.begin ();}
- const_iterator end () const {return map_.end ();}
-
-private:
- map map_;
-};
-
-// Map of scopes (e.g., class, namespace) to sets of virtual declarations.
-//
-typedef std::map<tree, virt_declaration_set> virt_declarations;
-extern virt_declarations virt_declarations_;
-
-// Real or virtual declaration. If it is real, then it is a pointer to
-// the GCC tree node. Otherwise, it is a pointer to virt_declaration
-// from virt_declarations_ above.
-//
-struct declaration
-{
- declaration (): virt (false) {decl.real = 0;}
- declaration (tree d): virt (false) {decl.real = d;}
- declaration (virt_declaration const& d): virt (true) {decl.virt = &d;}
-
- bool virt;
-
- union
- {
- tree real;
- virt_declaration const* virt;
- } decl;
-
- gcc_tree_code_type
- tree_code () const
- {
- return (virt ? decl.virt->tree_code : TREE_CODE (decl.real));
- }
-
- typedef bool declaration::*bool_convertible;
- operator bool_convertible () const
- {
- return ptr () == 0 ? 0 : &declaration::virt;
- }
-
-public:
- bool
- operator== (declaration const& x) const
- {
- return virt == x.virt && ptr () == x.ptr ();
- }
-
- bool
- operator!= (declaration const& x) const
- {
- return !(*this == x);
- }
-
- bool
- operator< (declaration const& x) const
- {
- return virt < x.virt || (virt == x.virt && ptr () < x.ptr ());
- }
-
-public:
- void const*
- ptr () const
- {
- return virt
- ? static_cast<void const*> (decl.virt)
- : static_cast<void const*> (decl.real);
- }
-};
-
-inline bool
-operator== (declaration const& x, tree y)
-{
- return !x.virt && x.decl.real == y;
-}
-
-inline bool
-operator== (tree x, declaration const& y)
-{
- return !y.virt && y.decl.real == x;
-}
-
-struct pragma
-{
- // Check that the pragma is applicable to the declaration. Return true
- // on success, complain and return false otherwise.
- //
- typedef bool (*check_func) (declaration const& decl,
- std::string const& decl_name,
- std::string const& prag_name,
- location_t);
-
- // Add the pragma value to the context.
- //
- typedef void (*add_func) (cutl::compiler::context&,
- std::string const& key,
- cutl::container::any const& value,
- location_t);
-
- pragma (std::string const& pn,
- std::string const& cn,
- cutl::container::any const& v,
- location_t l,
- check_func c,
- add_func a)
- : pragma_name (pn),
- context_name (cn),
- value (v),
- loc (l),
- check (c),
- add (a)
- {
- }
-
- std::string pragma_name; // Actual pragma name for diagnostics.
- std::string context_name; // Context entry name.
- cutl::container::any value;
- location_t loc;
- check_func check;
- add_func add;
-};
-
-typedef std::vector<pragma> pragma_list;
-
-// A set of pragmas. Insertion of a pragma with the same name and no
-// custom add function overrides the old value.
-//
-struct pragma_set: std::multimap<std::string, pragma>
-{
- typedef std::multimap<std::string, pragma> base;
-
- pragma&
- insert (pragma const& p)
- {
- std::string const& n (p.context_name);
- std::pair<iterator, iterator> r (equal_range (n));
-
- iterator i (end ());
-
- if (p.add == 0)
- {
- if (r.first != r.second)
- {
- i = r.first;
- assert (++r.first == r.second);
-
- i->second = p;
- }
- }
- else if (r.first != r.second)
- assert ((--r.second)->second.loc <= p.loc);
-
- if (i == end ())
- i = base::insert (base::value_type (n, p));
-
- return i->second;
- }
-
- void
- insert (const_iterator begin, const_iterator end)
- {
- for (; begin != end; ++begin)
- insert (begin->second);
- }
-
- // Return the last pragma in the equal range which (by construction) has the
- // location greater or equal to all the other pragmas in this range.
- //
- iterator
- find (std::string const& n)
- {
- return equal_range (n).second;
- }
-};
-
-
-// Position pragmas inside a class or namespace. The key for the
-// namespace case is the global_namespace node.
-//
-typedef std::map<tree, pragma_list> loc_pragmas;
-extern loc_pragmas loc_pragmas_;
-
-// Position pragmas for namespaces. Because re-opened namespaces do
-// not have any representation in the GCC tree, these are handled in
-// a special way. They are stored as a list of pragmas and their outer
-// namespaces.
-//
-struct ns_loc_pragma
-{
- typedef ::pragma pragma_type;
- ns_loc_pragma (tree n, pragma_type const& p): ns (n), pragma (p) {}
-
- tree ns;
- pragma_type pragma;
-};
-
-typedef std::vector<ns_loc_pragma> ns_loc_pragmas;
-extern ns_loc_pragmas ns_loc_pragmas_;
-
-// Pragmas associated with specific declarations (real or virtual).
-//
-typedef std::map<declaration, pragma_set> decl_pragmas;
-extern decl_pragmas decl_pragmas_;
-
-// Database we are generating code for as well as multi-database support.
-// Used to ignore database-specific pragmas.
-//
-extern database pragma_db_;
-extern multi_database pragma_multi_;
-
-extern "C" void
-register_odb_pragmas (void*, void*);
-
-struct pragmas_failed {};
-
-void
-post_process_pragmas ();
-
-#endif // ODB_PRAGMA_HXX