Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(156)

Side by Side Diff: include/private/SkTemplates.h

Issue 2274863002: sk_at_scope_end (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: use it! Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2006 The Android Open Source Project 3 * Copyright 2006 The Android Open Source Project
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #ifndef SkTemplates_DEFINED 10 #ifndef SkTemplates_DEFINED
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after
482 /** 482 /**
483 * Returns void* because this object does not initialize the 483 * Returns void* because this object does not initialize the
484 * memory. Use placement new for types that require a cons. 484 * memory. Use placement new for types that require a cons.
485 */ 485 */
486 void* get() { return fStorage.get(); } 486 void* get() { return fStorage.get(); }
487 const void* get() const { return fStorage.get(); } 487 const void* get() const { return fStorage.get(); }
488 private: 488 private:
489 SkAlignedSStorage<sizeof(T)*N> fStorage; 489 SkAlignedSStorage<sizeof(T)*N> fStorage;
490 }; 490 };
491 491
492 /**
493 * sk_at_scope_end(stmt) evaluates stmt when the current scope ends.
494 *
495 * E.g.
496 *
497 * int x = 5;
498 * {
499 * sk_at_scope_end(x--);
500 * SkASSERT(x == 5);
501 * }
502 * SkASSERT(x == 4);
503 */
504
505 template <typename Fn>
506 class SkScoped {
bungeman-skia 2016/08/24 21:39:49 As far as naming goes, the current proposal (p0052
507 public:
508 SkScoped(Fn&& fn) : fFn(std::move(fn)) {}
509 ~SkScoped() { fFn(); }
510
511 private:
512 // It makes no sense to copy SkScoped.
513 SkScoped (const SkScoped&) = delete;
514 SkScoped& operator=(const SkScoped&) = delete;
515
516 // We could potentially make moving SkScoped work.
517 SkScoped (SkScoped&&) = delete;
518 SkScoped& operator=(SkScoped&&) = delete;
519
520 Fn fFn;
521 };
522
523 template <typename Fn>
524 static inline SkScoped<Fn> sk_make_scoped(Fn&& fn) { return { std::move(fn) }; }
525
526 #define SCOPED_NAMEx(n) scoped_ ## n
527 #define SCOPED_NAME(n) SCOPED_NAMEx(n)
bungeman-skia 2016/08/24 21:39:49 These names seem a bit generic for something that
528
529 #define sk_at_scope_end(stmt) \
bungeman-skia 2016/08/24 21:39:49 You evil person making this define look like a fun
530 SK_UNUSED auto&& SCOPED_NAME(__COUNTER__) = sk_make_scoped([&] { stmt; })
bungeman-skia 2016/08/24 21:39:49 Looks like we've been using SK_MACRO_APPEND_LINE f
531
492 #endif 532 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698