return ss.str ();
}
-locus *
-abbrev_locus::clone () const
-{
- return new abbrev_locus (*this);
-}
-
abbrev_attrib_locus::abbrev_attrib_locus (uint64_t abbr_offset,
uint64_t attr_offset,
int a_name)
return ss.str ();
}
-locus *
-abbrev_attrib_locus::clone () const
-{
- return new abbrev_attrib_locus (*this);
-}
-
checkdescriptor const *
check_debug_abbrev::descriptor ()
{
#include "dwarf_version_i.hh"
class abbrev_locus
- : public locus
+ : public clonable_locus<abbrev_locus>
{
uint64_t _m_abbr_offset;
abbrev_locus (abbrev_locus const ©);
std::string format (bool brief = false) const;
- locus *clone () const;
};
class abbrev_attrib_locus
- : public locus
+ : public clonable_locus<abbrev_attrib_locus>
{
uint64_t _m_abbr_offset;
uint64_t _m_attr_offset;
void set_name (int name);
std::string format (bool brief = false) const;
std::string name () const;
- locus *clone () const;
};
struct abbrev_attrib
wr_error (&where, ": unresolved reference to " PRI_CU ".\n", cu_offset);
class cudie_locus
- : public locus
+ : public clonable_locus<cudie_locus>
{
uint64_t _m_offset;
ss << "unknown CU";
return ss.str ();
}
-
- locus *
- clone () const
- {
- return new cudie_locus (*this);
- }
};
cudie_locus cudie_loc (cu != NULL ? cu->cudie_offset : -1);
}
class locexpr_locus
- : public locus
+ : public clonable_locus<locexpr_locus>
{
uint64_t const _m_offset;
locus const *const _m_context;
return ss.str ();
}
- locus *
- clone () const
- {
- return new locexpr_locus (*this);
- }
-
virtual locus const *next () const
{
return _m_context;
namespace
{
class reloc_locus
- : public locus
+ : public clonable_locus<reloc_locus>
{
locus const &_m_ref;
size_t _m_index;
ss << " of " << _m_ref.format ();
return ss.str ();
}
-
- locus *
- clone () const
- {
- return new reloc_locus (*this);
- }
};
}
virtual ~locus () {}
};
-struct section_locus
+template <class T>
+class clonable_locus
: public locus
+{
+public:
+ virtual locus *clone () const
+ {
+ return new T (*static_cast<T const*> (this));
+ }
+};
+
+struct section_locus
+ : public clonable_locus<section_locus>
{
section_id _m_sec;
uint64_t _m_offset;
{}
std::string format (bool brief = false) const;
-
- locus *
- clone () const
- {
- return new section_locus (*this);
- }
};
struct where
- : public locus
+ : public clonable_locus<where>
{
class formatter
{
return _m_next;
}
- locus *
- clone () const
- {
- return new where (*this);
- }
-
void
set_next (locus const *nxt)
{