1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
/***************************************************************************
device.ipp
Device interface functions.
***************************************************************************/
#pragma once
#ifndef __EMU_H__
#error Dont include this file directly; include emu.h instead.
#endif
#ifndef MAME_EMU_DEVICE_IPP
#define MAME_EMU_DEVICE_IPP
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
typedef device_delegate<void (const XTAL &)> clock_update_delegate;
//**************************************************************************
// MEMBER TEMPLATES
//**************************************************************************
namespace emu::detail {
template <class DeviceClass> template <typename... Params>
inline DeviceClass &device_type_impl<DeviceClass>::operator()(machine_config &mconfig, char const *tag, Params &&... args) const
{
return dynamic_cast<DeviceClass &>(*mconfig.device_add(tag, *this, std::forward<Params>(args)...));
}
template <class DeviceClass> template <typename Exposed, bool Required, typename... Params>
inline DeviceClass &device_type_impl<DeviceClass>::operator()(machine_config &mconfig, device_finder<Exposed, Required> &finder, Params &&... args) const
{
std::pair<device_t &, char const *> const target(finder.finder_target());
assert(&mconfig.current_device() == &target.first);
DeviceClass &result(dynamic_cast<DeviceClass &>(*mconfig.device_add(target.second, *this, std::forward<Params>(args)...)));
return finder = result;
}
template <class DeviceClass> template <typename... Params>
inline DeviceClass &device_type_impl<DeviceClass>::operator()(machine_config_replace replace, char const *tag, Params &&... args) const
{
return dynamic_cast<DeviceClass &>(*replace.config.device_replace(tag, *this, std::forward<Params>(args)...));
}
template <class DeviceClass> template <typename Exposed, bool Required, typename... Params>
inline DeviceClass &device_type_impl<DeviceClass>::operator()(machine_config_replace replace, device_finder<Exposed, Required> &finder, Params &&... args) const
{
std::pair<device_t &, char const *> const target(finder.finder_target());
assert(&replace.config.current_device() == &target.first);
DeviceClass &result(dynamic_cast<DeviceClass &>(*replace.config.device_replace(target.second, *this, std::forward<Params>(args)...)));
return finder = result;
}
template <class DeviceClass, bool Required>
inline device_delegate_helper::device_delegate_helper(device_finder<DeviceClass, Required> const &finder)
: device_delegate_helper(finder.finder_target().first, finder.finder_tag())
{
}
template <class DeviceClass, bool Required>
inline void device_delegate_helper::set_tag(device_finder<DeviceClass, Required> const &finder)
{
std::tie(m_base, m_tag) = finder.finder_target();
}
} // namespace emu::detail
template <typename... T>
inline emu_timer *device_t::timer_alloc(T &&... args)
{
return machine().scheduler().timer_alloc(timer_expired_delegate(std::forward<T>(args)...));
}
template <typename Format, typename... Params>
inline void device_t::popmessage(Format &&fmt, Params &&... args) const
{
if (m_machine != nullptr)
m_machine->popmessage(std::forward<Format>(fmt), std::forward<Params>(args)...);
}
template <typename Format, typename... Params>
inline void device_t::logerror(Format &&fmt, Params &&... args) const
{
if (m_machine != nullptr && m_machine->allow_logging())
{
g_profiler.start(PROFILER_LOGERROR);
// dump to the buffer
m_string_buffer.clear();
m_string_buffer.seekp(0);
util::stream_format(m_string_buffer, "[%s] ", tag());
util::stream_format(m_string_buffer, std::forward<Format>(fmt), std::forward<Params>(args)...);
m_string_buffer.put('\0');
m_machine->strlog(&m_string_buffer.vec()[0]);
g_profiler.stop();
}
}
template <typename T, typename Ret, typename... Params>
inline void device_memory_interface::set_addrmap(int spacenum, Ret (T::*func)(Params... args))
{
device_t &dev(device().mconfig().current_device());
if constexpr (is_related_class<device_t, T>::value)
set_addrmap(spacenum, address_map_constructor(func, dev.tag(), &downcast<T &>(dev)));
else
set_addrmap(spacenum, address_map_constructor(func, dev.tag(), &dynamic_cast<T &>(dev)));
}
#endif // MAME_EMU_DEVICE_IPP
|