Message ID | 20210211133444.764808-6-kieran.bingham@ideasonboard.com |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
Hi Kieran, Thank you for the patch. On Thu, Feb 11, 2021 at 01:34:43PM +0000, Kieran Bingham wrote: > Replace existing use cases where the copy constructor and copy > assignment operator are deleted with the LIBCAMERA_DISABLE_COPY > statement > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > --- > include/libcamera/camera.h | 6 +++--- > include/libcamera/camera_manager.h | 4 ++-- > include/libcamera/controls.h | 7 +++---- > include/libcamera/framebuffer_allocator.h | 7 ++++--- > include/libcamera/internal/byte_stream_buffer.h | 4 ++-- > include/libcamera/internal/camera_sensor.h | 6 +++--- > include/libcamera/internal/file.h | 6 +++--- > include/libcamera/internal/log.h | 6 +++++- > include/libcamera/internal/pipeline_handler.h | 4 ++-- > include/libcamera/internal/v4l2_subdevice.h | 5 +++-- > include/libcamera/internal/v4l2_videodevice.h | 6 +++--- > include/libcamera/request.h | 5 +++-- > 12 files changed, 36 insertions(+), 30 deletions(-) > > diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h > index cff9f46e801b..568740a37778 100644 > --- a/include/libcamera/camera.h > +++ b/include/libcamera/camera.h > @@ -81,9 +81,6 @@ public: > const std::string &id, > const std::set<Stream *> &streams); > > - Camera(const Camera &) = delete; > - Camera &operator=(const Camera &) = delete; > - > const std::string &id() const; > > Signal<Request *, FrameBuffer *> bufferCompleted; > @@ -109,6 +106,9 @@ public: > private: > Camera(PipelineHandler *pipe, const std::string &id, > const std::set<Stream *> &streams); > + > + LIBCAMERA_DISABLE_COPY(Camera); Let's move this right after "private:" for consistency. > + > ~Camera(); > > friend class PipelineHandler; > diff --git a/include/libcamera/camera_manager.h b/include/libcamera/camera_manager.h > index 7b8e533fadd6..467cfd0ac4ac 100644 > --- a/include/libcamera/camera_manager.h > +++ b/include/libcamera/camera_manager.h > @@ -25,8 +25,6 @@ class CameraManager : public Object, public Extensible > LIBCAMERA_DECLARE_PRIVATE(CameraManager) > public: > CameraManager(); > - CameraManager(const CameraManager &) = delete; > - CameraManager &operator=(const CameraManager &) = delete; > ~CameraManager(); > > int start(); > @@ -46,6 +44,8 @@ public: > Signal<std::shared_ptr<Camera>> cameraRemoved; > > private: > + LIBCAMERA_DISABLE_COPY(CameraManager); > + > static const std::string version_; > static CameraManager *self_; > }; > diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h > index 3b7f3347761e..a5c9bda28661 100644 > --- a/include/libcamera/controls.h > +++ b/include/libcamera/controls.h > @@ -14,6 +14,7 @@ > #include <unordered_map> > #include <vector> > > +#include <libcamera/class.h> > #include <libcamera/geometry.h> > #include <libcamera/span.h> > > @@ -220,8 +221,7 @@ public: > ControlType type() const { return type_; } > > private: > - ControlId &operator=(const ControlId &) = delete; > - ControlId(const ControlId &) = delete; > + LIBCAMERA_DISABLE_COPY(ControlId); This, and Control, should use LIBCAMERA_DISABLE_COPY_AND_MOVE. You can do so in an additional patch, or split this change out to a patch that uses the macro and changes the semantics in one go. Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > unsigned int id_; > std::string name_; > @@ -260,8 +260,7 @@ public: > } > > private: > - Control(const Control &) = delete; > - Control &operator=(const Control &) = delete; > + LIBCAMERA_DISABLE_COPY(Control); > }; > > class ControlInfo > diff --git a/include/libcamera/framebuffer_allocator.h b/include/libcamera/framebuffer_allocator.h > index a96aaeae58ce..9e42de280c98 100644 > --- a/include/libcamera/framebuffer_allocator.h > +++ b/include/libcamera/framebuffer_allocator.h > @@ -11,6 +11,8 @@ > #include <memory> > #include <vector> > > +#include <libcamera/class.h> > + > namespace libcamera { > > class Camera; > @@ -21,9 +23,6 @@ class FrameBufferAllocator > { > public: > FrameBufferAllocator(std::shared_ptr<Camera> camera); > - FrameBufferAllocator(const FrameBufferAllocator &) = delete; > - FrameBufferAllocator &operator=(const FrameBufferAllocator &) = delete; > - > ~FrameBufferAllocator(); > > int allocate(Stream *stream); > @@ -33,6 +32,8 @@ public: > const std::vector<std::unique_ptr<FrameBuffer>> &buffers(Stream *stream) const; > > private: > + LIBCAMERA_DISABLE_COPY(FrameBufferAllocator); > + > std::shared_ptr<Camera> camera_; > std::map<Stream *, std::vector<std::unique_ptr<FrameBuffer>>> buffers_; > }; > diff --git a/include/libcamera/internal/byte_stream_buffer.h b/include/libcamera/internal/byte_stream_buffer.h > index db59577dc332..ec8b0b2ada86 100644 > --- a/include/libcamera/internal/byte_stream_buffer.h > +++ b/include/libcamera/internal/byte_stream_buffer.h > @@ -11,6 +11,7 @@ > #include <stdint.h> > #include <type_traits> > > +#include <libcamera/class.h> > #include <libcamera/span.h> > > namespace libcamera { > @@ -65,8 +66,7 @@ public: > } > > private: > - ByteStreamBuffer(const ByteStreamBuffer &other) = delete; > - ByteStreamBuffer &operator=(const ByteStreamBuffer &other) = delete; > + LIBCAMERA_DISABLE_COPY(ByteStreamBuffer); > > void setOverflow(); > > diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h > index c8f81882a958..9d26bd24a321 100644 > --- a/include/libcamera/internal/camera_sensor.h > +++ b/include/libcamera/internal/camera_sensor.h > @@ -11,6 +11,7 @@ > #include <string> > #include <vector> > > +#include <libcamera/class.h> > #include <libcamera/controls.h> > #include <libcamera/geometry.h> > > @@ -45,9 +46,6 @@ public: > explicit CameraSensor(const MediaEntity *entity); > ~CameraSensor(); > > - CameraSensor(const CameraSensor &) = delete; > - CameraSensor &operator=(const CameraSensor &) = delete; > - > int init(); > > const std::string &model() const { return model_; } > @@ -74,6 +72,8 @@ protected: > std::string logPrefix() const override; > > private: > + LIBCAMERA_DISABLE_COPY(CameraSensor); > + > int generateId(); > int validateSensorDriver(); > void initVimcDefaultProperties(); > diff --git a/include/libcamera/internal/file.h b/include/libcamera/internal/file.h > index 9b6d011f5e9d..2f75aaf00dab 100644 > --- a/include/libcamera/internal/file.h > +++ b/include/libcamera/internal/file.h > @@ -11,6 +11,7 @@ > #include <string> > #include <sys/types.h> > > +#include <libcamera/class.h> > #include <libcamera/span.h> > > namespace libcamera { > @@ -34,9 +35,6 @@ public: > File(); > ~File(); > > - File(const File &) = delete; > - File &operator=(const File &) = delete; > - > const std::string &fileName() const { return name_; } > void setFileName(const std::string &name); > bool exists() const; > @@ -62,6 +60,8 @@ public: > static bool exists(const std::string &name); > > private: > + LIBCAMERA_DISABLE_COPY(File); > + > void unmapAll(); > > std::string name_; > diff --git a/include/libcamera/internal/log.h b/include/libcamera/internal/log.h > index 4b10087a4718..5c44d623797a 100644 > --- a/include/libcamera/internal/log.h > +++ b/include/libcamera/internal/log.h > @@ -10,6 +10,8 @@ > #include <chrono> > #include <sstream> > > +#include <libcamera/class.h> > + > #include "libcamera/internal/utils.h" > > namespace libcamera { > @@ -57,7 +59,7 @@ public: > LogSeverity severity); > LogMessage(const char *fileName, unsigned int line, > const LogCategory &category, LogSeverity severity); > - LogMessage(const LogMessage &) = delete; > + > LogMessage(LogMessage &&); > ~LogMessage(); > > @@ -70,6 +72,8 @@ public: > const std::string msg() const { return msgStream_.str(); } > > private: > + LIBCAMERA_DISABLE_COPY(LogMessage); > + > void init(const char *fileName, unsigned int line); > > std::ostringstream msgStream_; > diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h > index 0748f8634608..d5913eae88ca 100644 > --- a/include/libcamera/internal/pipeline_handler.h > +++ b/include/libcamera/internal/pipeline_handler.h > @@ -15,6 +15,7 @@ > #include <sys/types.h> > #include <vector> > > +#include <libcamera/class.h> > #include <libcamera/controls.h> > #include <libcamera/object.h> > #include <libcamera/stream.h> > @@ -49,8 +50,7 @@ public: > std::unique_ptr<IPAProxy> ipa_; > > private: > - CameraData(const CameraData &) = delete; > - CameraData &operator=(const CameraData &) = delete; > + LIBCAMERA_DISABLE_COPY(CameraData); > }; > > class PipelineHandler : public std::enable_shared_from_this<PipelineHandler>, > diff --git a/include/libcamera/internal/v4l2_subdevice.h b/include/libcamera/internal/v4l2_subdevice.h > index eb25fa2fd01b..f983ae6302bb 100644 > --- a/include/libcamera/internal/v4l2_subdevice.h > +++ b/include/libcamera/internal/v4l2_subdevice.h > @@ -11,6 +11,7 @@ > #include <string> > #include <vector> > > +#include <libcamera/class.h> > #include <libcamera/geometry.h> > > #include "libcamera/internal/formats.h" > @@ -41,8 +42,6 @@ public: > }; > > explicit V4L2Subdevice(const MediaEntity *entity); > - V4L2Subdevice(const V4L2Subdevice &) = delete; > - V4L2Subdevice &operator=(const V4L2Subdevice &) = delete; > ~V4L2Subdevice(); > > int open(); > @@ -68,6 +67,8 @@ protected: > std::string logPrefix() const override; > > private: > + LIBCAMERA_DISABLE_COPY(V4L2Subdevice); > + > std::vector<unsigned int> enumPadCodes(unsigned int pad); > std::vector<SizeRange> enumPadSizes(unsigned int pad, > unsigned int code); > diff --git a/include/libcamera/internal/v4l2_videodevice.h b/include/libcamera/internal/v4l2_videodevice.h > index 626dfbcd6113..f8da608603ef 100644 > --- a/include/libcamera/internal/v4l2_videodevice.h > +++ b/include/libcamera/internal/v4l2_videodevice.h > @@ -17,6 +17,7 @@ > #include <linux/videodev2.h> > > #include <libcamera/buffer.h> > +#include <libcamera/class.h> > #include <libcamera/geometry.h> > #include <libcamera/pixel_format.h> > #include <libcamera/signal.h> > @@ -175,11 +176,8 @@ public: > > explicit V4L2VideoDevice(const std::string &deviceNode); > explicit V4L2VideoDevice(const MediaEntity *entity); > - V4L2VideoDevice(const V4L2VideoDevice &) = delete; > ~V4L2VideoDevice(); > > - V4L2VideoDevice &operator=(const V4L2VideoDevice &) = delete; > - > int open(); > int open(int handle, enum v4l2_buf_type type); > void close(); > @@ -219,6 +217,8 @@ protected: > std::string logPrefix() const override; > > private: > + LIBCAMERA_DISABLE_COPY(V4L2VideoDevice); > + > int getFormatMeta(V4L2DeviceFormat *format); > int trySetFormatMeta(V4L2DeviceFormat *format, bool set); > > diff --git a/include/libcamera/request.h b/include/libcamera/request.h > index 655b1324bae8..3354ae9083f1 100644 > --- a/include/libcamera/request.h > +++ b/include/libcamera/request.h > @@ -12,6 +12,7 @@ > #include <stdint.h> > #include <unordered_set> > > +#include <libcamera/class.h> > #include <libcamera/controls.h> > #include <libcamera/signal.h> > > @@ -39,8 +40,6 @@ public: > using BufferMap = std::map<const Stream *, FrameBuffer *>; > > Request(Camera *camera, uint64_t cookie = 0); > - Request(const Request &) = delete; > - Request &operator=(const Request &) = delete; > ~Request(); > > void reuse(ReuseFlag flags = Default); > @@ -57,6 +56,8 @@ public: > bool hasPendingBuffers() const { return !pending_.empty(); } > > private: > + LIBCAMERA_DISABLE_COPY(Request); > + > friend class PipelineHandler; > > void complete();
diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h index cff9f46e801b..568740a37778 100644 --- a/include/libcamera/camera.h +++ b/include/libcamera/camera.h @@ -81,9 +81,6 @@ public: const std::string &id, const std::set<Stream *> &streams); - Camera(const Camera &) = delete; - Camera &operator=(const Camera &) = delete; - const std::string &id() const; Signal<Request *, FrameBuffer *> bufferCompleted; @@ -109,6 +106,9 @@ public: private: Camera(PipelineHandler *pipe, const std::string &id, const std::set<Stream *> &streams); + + LIBCAMERA_DISABLE_COPY(Camera); + ~Camera(); friend class PipelineHandler; diff --git a/include/libcamera/camera_manager.h b/include/libcamera/camera_manager.h index 7b8e533fadd6..467cfd0ac4ac 100644 --- a/include/libcamera/camera_manager.h +++ b/include/libcamera/camera_manager.h @@ -25,8 +25,6 @@ class CameraManager : public Object, public Extensible LIBCAMERA_DECLARE_PRIVATE(CameraManager) public: CameraManager(); - CameraManager(const CameraManager &) = delete; - CameraManager &operator=(const CameraManager &) = delete; ~CameraManager(); int start(); @@ -46,6 +44,8 @@ public: Signal<std::shared_ptr<Camera>> cameraRemoved; private: + LIBCAMERA_DISABLE_COPY(CameraManager); + static const std::string version_; static CameraManager *self_; }; diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h index 3b7f3347761e..a5c9bda28661 100644 --- a/include/libcamera/controls.h +++ b/include/libcamera/controls.h @@ -14,6 +14,7 @@ #include <unordered_map> #include <vector> +#include <libcamera/class.h> #include <libcamera/geometry.h> #include <libcamera/span.h> @@ -220,8 +221,7 @@ public: ControlType type() const { return type_; } private: - ControlId &operator=(const ControlId &) = delete; - ControlId(const ControlId &) = delete; + LIBCAMERA_DISABLE_COPY(ControlId); unsigned int id_; std::string name_; @@ -260,8 +260,7 @@ public: } private: - Control(const Control &) = delete; - Control &operator=(const Control &) = delete; + LIBCAMERA_DISABLE_COPY(Control); }; class ControlInfo diff --git a/include/libcamera/framebuffer_allocator.h b/include/libcamera/framebuffer_allocator.h index a96aaeae58ce..9e42de280c98 100644 --- a/include/libcamera/framebuffer_allocator.h +++ b/include/libcamera/framebuffer_allocator.h @@ -11,6 +11,8 @@ #include <memory> #include <vector> +#include <libcamera/class.h> + namespace libcamera { class Camera; @@ -21,9 +23,6 @@ class FrameBufferAllocator { public: FrameBufferAllocator(std::shared_ptr<Camera> camera); - FrameBufferAllocator(const FrameBufferAllocator &) = delete; - FrameBufferAllocator &operator=(const FrameBufferAllocator &) = delete; - ~FrameBufferAllocator(); int allocate(Stream *stream); @@ -33,6 +32,8 @@ public: const std::vector<std::unique_ptr<FrameBuffer>> &buffers(Stream *stream) const; private: + LIBCAMERA_DISABLE_COPY(FrameBufferAllocator); + std::shared_ptr<Camera> camera_; std::map<Stream *, std::vector<std::unique_ptr<FrameBuffer>>> buffers_; }; diff --git a/include/libcamera/internal/byte_stream_buffer.h b/include/libcamera/internal/byte_stream_buffer.h index db59577dc332..ec8b0b2ada86 100644 --- a/include/libcamera/internal/byte_stream_buffer.h +++ b/include/libcamera/internal/byte_stream_buffer.h @@ -11,6 +11,7 @@ #include <stdint.h> #include <type_traits> +#include <libcamera/class.h> #include <libcamera/span.h> namespace libcamera { @@ -65,8 +66,7 @@ public: } private: - ByteStreamBuffer(const ByteStreamBuffer &other) = delete; - ByteStreamBuffer &operator=(const ByteStreamBuffer &other) = delete; + LIBCAMERA_DISABLE_COPY(ByteStreamBuffer); void setOverflow(); diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h index c8f81882a958..9d26bd24a321 100644 --- a/include/libcamera/internal/camera_sensor.h +++ b/include/libcamera/internal/camera_sensor.h @@ -11,6 +11,7 @@ #include <string> #include <vector> +#include <libcamera/class.h> #include <libcamera/controls.h> #include <libcamera/geometry.h> @@ -45,9 +46,6 @@ public: explicit CameraSensor(const MediaEntity *entity); ~CameraSensor(); - CameraSensor(const CameraSensor &) = delete; - CameraSensor &operator=(const CameraSensor &) = delete; - int init(); const std::string &model() const { return model_; } @@ -74,6 +72,8 @@ protected: std::string logPrefix() const override; private: + LIBCAMERA_DISABLE_COPY(CameraSensor); + int generateId(); int validateSensorDriver(); void initVimcDefaultProperties(); diff --git a/include/libcamera/internal/file.h b/include/libcamera/internal/file.h index 9b6d011f5e9d..2f75aaf00dab 100644 --- a/include/libcamera/internal/file.h +++ b/include/libcamera/internal/file.h @@ -11,6 +11,7 @@ #include <string> #include <sys/types.h> +#include <libcamera/class.h> #include <libcamera/span.h> namespace libcamera { @@ -34,9 +35,6 @@ public: File(); ~File(); - File(const File &) = delete; - File &operator=(const File &) = delete; - const std::string &fileName() const { return name_; } void setFileName(const std::string &name); bool exists() const; @@ -62,6 +60,8 @@ public: static bool exists(const std::string &name); private: + LIBCAMERA_DISABLE_COPY(File); + void unmapAll(); std::string name_; diff --git a/include/libcamera/internal/log.h b/include/libcamera/internal/log.h index 4b10087a4718..5c44d623797a 100644 --- a/include/libcamera/internal/log.h +++ b/include/libcamera/internal/log.h @@ -10,6 +10,8 @@ #include <chrono> #include <sstream> +#include <libcamera/class.h> + #include "libcamera/internal/utils.h" namespace libcamera { @@ -57,7 +59,7 @@ public: LogSeverity severity); LogMessage(const char *fileName, unsigned int line, const LogCategory &category, LogSeverity severity); - LogMessage(const LogMessage &) = delete; + LogMessage(LogMessage &&); ~LogMessage(); @@ -70,6 +72,8 @@ public: const std::string msg() const { return msgStream_.str(); } private: + LIBCAMERA_DISABLE_COPY(LogMessage); + void init(const char *fileName, unsigned int line); std::ostringstream msgStream_; diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h index 0748f8634608..d5913eae88ca 100644 --- a/include/libcamera/internal/pipeline_handler.h +++ b/include/libcamera/internal/pipeline_handler.h @@ -15,6 +15,7 @@ #include <sys/types.h> #include <vector> +#include <libcamera/class.h> #include <libcamera/controls.h> #include <libcamera/object.h> #include <libcamera/stream.h> @@ -49,8 +50,7 @@ public: std::unique_ptr<IPAProxy> ipa_; private: - CameraData(const CameraData &) = delete; - CameraData &operator=(const CameraData &) = delete; + LIBCAMERA_DISABLE_COPY(CameraData); }; class PipelineHandler : public std::enable_shared_from_this<PipelineHandler>, diff --git a/include/libcamera/internal/v4l2_subdevice.h b/include/libcamera/internal/v4l2_subdevice.h index eb25fa2fd01b..f983ae6302bb 100644 --- a/include/libcamera/internal/v4l2_subdevice.h +++ b/include/libcamera/internal/v4l2_subdevice.h @@ -11,6 +11,7 @@ #include <string> #include <vector> +#include <libcamera/class.h> #include <libcamera/geometry.h> #include "libcamera/internal/formats.h" @@ -41,8 +42,6 @@ public: }; explicit V4L2Subdevice(const MediaEntity *entity); - V4L2Subdevice(const V4L2Subdevice &) = delete; - V4L2Subdevice &operator=(const V4L2Subdevice &) = delete; ~V4L2Subdevice(); int open(); @@ -68,6 +67,8 @@ protected: std::string logPrefix() const override; private: + LIBCAMERA_DISABLE_COPY(V4L2Subdevice); + std::vector<unsigned int> enumPadCodes(unsigned int pad); std::vector<SizeRange> enumPadSizes(unsigned int pad, unsigned int code); diff --git a/include/libcamera/internal/v4l2_videodevice.h b/include/libcamera/internal/v4l2_videodevice.h index 626dfbcd6113..f8da608603ef 100644 --- a/include/libcamera/internal/v4l2_videodevice.h +++ b/include/libcamera/internal/v4l2_videodevice.h @@ -17,6 +17,7 @@ #include <linux/videodev2.h> #include <libcamera/buffer.h> +#include <libcamera/class.h> #include <libcamera/geometry.h> #include <libcamera/pixel_format.h> #include <libcamera/signal.h> @@ -175,11 +176,8 @@ public: explicit V4L2VideoDevice(const std::string &deviceNode); explicit V4L2VideoDevice(const MediaEntity *entity); - V4L2VideoDevice(const V4L2VideoDevice &) = delete; ~V4L2VideoDevice(); - V4L2VideoDevice &operator=(const V4L2VideoDevice &) = delete; - int open(); int open(int handle, enum v4l2_buf_type type); void close(); @@ -219,6 +217,8 @@ protected: std::string logPrefix() const override; private: + LIBCAMERA_DISABLE_COPY(V4L2VideoDevice); + int getFormatMeta(V4L2DeviceFormat *format); int trySetFormatMeta(V4L2DeviceFormat *format, bool set); diff --git a/include/libcamera/request.h b/include/libcamera/request.h index 655b1324bae8..3354ae9083f1 100644 --- a/include/libcamera/request.h +++ b/include/libcamera/request.h @@ -12,6 +12,7 @@ #include <stdint.h> #include <unordered_set> +#include <libcamera/class.h> #include <libcamera/controls.h> #include <libcamera/signal.h> @@ -39,8 +40,6 @@ public: using BufferMap = std::map<const Stream *, FrameBuffer *>; Request(Camera *camera, uint64_t cookie = 0); - Request(const Request &) = delete; - Request &operator=(const Request &) = delete; ~Request(); void reuse(ReuseFlag flags = Default); @@ -57,6 +56,8 @@ public: bool hasPendingBuffers() const { return !pending_.empty(); } private: + LIBCAMERA_DISABLE_COPY(Request); + friend class PipelineHandler; void complete();
Replace existing use cases where the copy constructor and copy assignment operator are deleted with the LIBCAMERA_DISABLE_COPY statement Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> --- include/libcamera/camera.h | 6 +++--- include/libcamera/camera_manager.h | 4 ++-- include/libcamera/controls.h | 7 +++---- include/libcamera/framebuffer_allocator.h | 7 ++++--- include/libcamera/internal/byte_stream_buffer.h | 4 ++-- include/libcamera/internal/camera_sensor.h | 6 +++--- include/libcamera/internal/file.h | 6 +++--- include/libcamera/internal/log.h | 6 +++++- include/libcamera/internal/pipeline_handler.h | 4 ++-- include/libcamera/internal/v4l2_subdevice.h | 5 +++-- include/libcamera/internal/v4l2_videodevice.h | 6 +++--- include/libcamera/request.h | 5 +++-- 12 files changed, 36 insertions(+), 30 deletions(-)